LeetCode奇幻漂流(一)Two Sum

从大一开始就接触ACM,到入职后做OJ题,在提交答案后AC以后的成就感,确实是无与伦比得快乐。貌似又扯远了,最近刚刚接触到leetcode(据说是各大互联网公司面试考基础的参考题目),因此无论你之前是多么熟悉或者精通一门语言,如果长时间不用,那么必将生疏,而且那种生疏比起什么都不会更为可怕,所以说学习一门编程语言最好的办法就使用它,而leetcode上的题目可以帮我实现这一点。

好了,话不多说,先看这道题目-Two Sum,这是leetcode上的第一道题,也作为我们的开胃小菜,在今天首先说一下它的解题思路。

题目要求:
这里写图片描述

题目思路:
乍一看没什么难度,实际上确实没什么难度,最笨最笨的办法就是遍历,一个二重循环就搞定了,代码如下:

int* twoSum(int* nums, int numsSize, int target) {
     int *ReturnResult = NULL;

     for (int i = 0; i < numsSize; i ++)
     {
         for (int j = 0; j < numsSize; j ++)
         {
             if (i == j)
             {
                 continue;
             }
             if (nums[j] == target - nums[i])
             {
                ReturnResult = (int *)malloc(sizeof(int) * 2);
                ReturnResult[0] = i;
                ReturnResult[1] = j;
                return ReturnResult;
             }
         }
     }
     ReturnResult = (int *)malloc(sizeof(int) * 2);
     ReturnResult[0] = 0;
     ReturnResult[1] = 0;
     return ReturnResult;
}

我是用C语言实现的,这里要注意的是要返回一个长度为2的数组,因此返回值要求是数组的头指针,整个代码可以说简单粗暴,两重循环,简单明了,当我提交的时候,也AC了,出师大捷啊,结果去查看用例运行情况时却发现:
这里写图片描述
尼玛啊,号称速度最快的C语言,就这速度,说出来简直丢人啊。。
后来想了想,丢人的不是C语言,而是我这个算法实在是太笨了,时间复杂度基本是最慢的O(N^2)。
作为有追求的程序员,当然是要想办法精益求精,那么我们就要分析问题出在哪了,然后再去想办法去优化。

优化点:当确定一个头元素后,查找与之匹配的元素太耗时,每次都要有n-1次遍历,也就是最慢的顺序查找,假如说我们的输入队列是有序的,那么就可以用二分查找来搞定,速度可以提升不少,那么第一个优化点就找到了:
查找匹配元素 顺序查找:n-1次 二分查找 logN次
对了,说起查找,最快的查找是什么呢?据说有一种时间复杂度为O(1)的神奇查找方式,不知道大家有没有想到,那就是-hash

hash算法就不再赘述了,其最大的好处就是查找迅速,你可以简单理解为可以通过你想要查找的数据值来找到数据相应的存储位置(假如存在),试想一下,如果这道题用hash,那么效率是不是蹭蹭蹭上好几个档次呢,关于hash算法的实现,楼主我也是正在想,等想出来以后一定会和大家分享,而之前那个代码大家就先参考下吧(针对基础一般般的同学,大神们请无视之)。
好了,今天就到此为止,目标是今年刷完leetcode,每天进步一点点,生活美好不止一点点!

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值