抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

1
2
3
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {

}

2.个人思路

​ 一看题目有些蒙,题目要求返回两个数组下标,但却是返回int* 类型。思路是有的,遍历:两个for循环然后if判断,在clion中应该是能写的出来的,但是这里实在不知道这个语法。真是拉了一坨大的。

献丑了:

1
2
3
4
5
6
7
8
9
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
for (int i = 0; i < numsSize; i++) {
for (int j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
return *i;
}
}
}
}

编译失败!!!

歪头看b站法:

c语言写力扣的好少,想用c++刷题了。

int *array动态分配了一个可以存放两个int大小的内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int *array = (int *)malloc(2*sizeof(int));
for (int i = 0; i < numsSize; i++)
{
for (int j = i + 1; j < numsSize; j++)
{
if (nums[i] + nums[j] == target)
{
array[0] = i;
array[1] = j;
*returnSize = 2;
return array;
}
}
}
*returnSize=0;
return array;
}

暴力遍历时间复杂度太大了关于时间复杂度,你不知道的都在这里!,运行时间115ms。有要用到哈希表的方式…..在百度一下哈希表数据结构 Hash表(哈希表)-CSDN博客

3.官方代码

注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。

使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N) 降低到 O(1)。

这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
struct hashTable {
int key;
int val;
UT_hash_handle hh;
};

struct hashTable* hashtable;

struct hashTable* find(int ikey) {
struct hashTable* tmp;
HASH_FIND_INT(hashtable, &ikey, tmp);
return tmp;
}

void insert(int ikey, int ival) {
struct hashTable* it = find(ikey);
if (it == NULL) {
struct hashTable* tmp = malloc(sizeof(struct hashTable));
tmp->key = ikey, tmp->val = ival;
HASH_ADD_INT(hashtable, key, tmp);
} else {
it->val = ival;
}
}

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
hashtable = NULL;
for (int i = 0; i < numsSize; i++) {
struct hashTable* it = find(target - nums[i]);
if (it != NULL) {
int* ret = malloc(sizeof(int) * 2);
ret[0] = it->val, ret[1] = i;
*returnSize = 2;
return ret;
}
insert(nums[i], i);
}
*returnSize = 0;
return NULL;
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/two-sum/solutions/434597/liang-shu-zhi-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4.补充

​ 发现自己写的代码,没有用到所给的全部条件,考虑问题不全面,另外返回值也不知道如何处理,基础过于薄弱。

4.1 4个值分别代表:

  • int* nums——nums数组( 此形式等同于int nums[] )
  • numsSize——数组元素的个数
  • target——需要求和的结果
  • int* returnSize——返回值的个数(这个不可以省略!)

4.2 返回元素下标

当代码成功找到了两个相加等于target的元素后,我们要返回这两个元素的下标

这里就需要一个新的数组来接收这两个下标,这比单纯的使用两个变量更方便

创建这个数组有两种方法

  1. 使用arr[2]来创建
  2. 使用malloc函数来创建

题目注释也给到

1
/* Note: The returned array must be malloced, assume caller calls free(). */

看到一个非常好的博客:【leetcode】001.两数之和(C语言/C++,超详细)_leetcode两数之和c语言-CSDN博客

评论