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
|
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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
4.补充
发现自己写的代码,没有用到所给的全部条件,考虑问题不全面,另外返回值也不知道如何处理,基础过于薄弱。
4.1 4个值分别代表:
- int* nums——nums数组( 此形式等同于int nums[] )
- numsSize——数组元素的个数
- target——需要求和的结果
- int* returnSize——返回值的个数(这个不可以省略!)
4.2 返回元素下标
当代码成功找到了两个相加等于target的元素后,我们要返回这两个元素的下标
这里就需要一个新的数组来接收这两个下标,这比单纯的使用两个变量更方便
创建这个数组有两种方法
- 使用arr[2]来创建
- 使用malloc函数来创建
题目注释也给到
看到一个非常好的博客:【leetcode】001.两数之和(C语言/C++,超详细)_leetcode两数之和c语言-CSDN博客