题解 | #两数之和#
两数之和
https://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f
利用哈希表的思想原地遍历(C语言)
看到题目要求时间复杂度为O(nlogn),直接打消了暴力遍历的思路。
本来我是想学官方题解用哈希表的,发现用C写好像不容易搞(搞了半天没搞出来),突发奇想,能不能不创建额外的哈希数组,直接原地遍历查找呢?🧐🧐
根据官方题解的哈希表的思路,有:定义一个哈希表,用目标数字减去数组中的数字得到差,去哈希表中查看,是否存在差,如果不存在,则将数组中的数字存放入哈希表,如果哈希表中存在差,则取出数字的下标。
我就突然想到了,假设现在遍历number数组到了第i位,还没有结束,那么此时哈希表中的元素不就和number前i-1位的元素相同吗?不就是number的子数组吗?那我查找哈希表这一步可不可以改成直接查找number数组前i-1位呢?这样连哈希数组都不需要创建了,空间复杂度直接变为O(1)。
这里其实也做了些优化的,比如说第一个for循环中先看看第一个数是否足够大于target,也就是和target+10比较,要是比较大就不用看后面了,直接continue,+10是因为target最小为-10。
代码实现
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) { int* ret = (int*)malloc(sizeof(int)*2); *returnSize = 2; for(int i = 0; i < numbersLen; i++) { if(numbers[i] > target + 10) continue; for(int j = 0; j < i; j++) { if(numbers[j] == target - numbers[i]) { ret[0] = j + 1; ret[1] = i + 1; goto end; } } } end: return ret; }