题解 | #两数之和#

两数之和

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

相关推荐

点赞 评论 收藏
分享
那一天的Java_Java起来:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

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