题解 | #两数之和#

两数之和

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;   
}
全部评论

相关推荐

06-25 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
真烦好烦真烦:豆包润色了自己没看看吗,再说了,都说豆包是愚蠢且勤快的大学生,ds才是聪明的研究生,怎么敢让豆包写论文的
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务