LeetCode奇幻漂流(一)Two Sum
2016-04-22 22:49
337 查看
从大一开始就接触ACM,到入职后做OJ题,在提交答案后AC以后的成就感,确实是无与伦比得快乐。貌似又扯远了,最近刚刚接触到leetcode(据说是各大互联网公司面试考基础的参考题目),因此无论你之前是多么熟悉或者精通一门语言,如果长时间不用,那么必将生疏,而且那种生疏比起什么都不会更为可怕,所以说学习一门编程语言最好的办法就使用它,而leetcode上的题目可以帮我实现这一点。
好了,话不多说,先看这道题目-Two Sum,这是leetcode上的第一道题,也作为我们的开胃小菜,在今天首先说一下它的解题思路。
题目要求:
![](https://img-blog.csdn.net/20160422222951400)
题目思路:
乍一看没什么难度,实际上确实没什么难度,最笨最笨的办法就是遍历,一个二重循环就搞定了,代码如下:
我是用C语言实现的,这里要注意的是要返回一个长度为2的数组,因此返回值要求是数组的头指针,整个代码可以说简单粗暴,两重循环,简单明了,当我提交的时候,也AC了,出师大捷啊,结果去查看用例运行情况时却发现:
![](https://img-blog.csdn.net/20160422223946841)
尼玛啊,号称速度最快的C语言,就这速度,说出来简直丢人啊。。
后来想了想,丢人的不是C语言,而是我这个算法实在是太笨了,时间复杂度基本是最慢的O(N^2)。
作为有追求的程序员,当然是要想办法精益求精,那么我们就要分析问题出在哪了,然后再去想办法去优化。
优化点:当确定一个头元素后,查找与之匹配的元素太耗时,每次都要有n-1次遍历,也就是最慢的顺序查找,假如说我们的输入队列是有序的,那么就可以用二分查找来搞定,速度可以提升不少,那么第一个优化点就找到了:
查找匹配元素 顺序查找:n-1次 二分查找 logN次
对了,说起查找,最快的查找是什么呢?据说有一种时间复杂度为O(1)的神奇查找方式,不知道大家有没有想到,那就是-hash
hash算法就不再赘述了,其最大的好处就是查找迅速,你可以简单理解为可以通过你想要查找的数据值来找到数据相应的存储位置(假如存在),试想一下,如果这道题用hash,那么效率是不是蹭蹭蹭上好几个档次呢,关于hash算法的实现,楼主我也是正在想,等想出来以后一定会和大家分享,而之前那个代码大家就先参考下吧(针对基础一般般的同学,大神们请无视之)。
好了,今天就到此为止,目标是今年刷完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,每天进步一点点,生活美好不止一点点!
相关文章推荐
- 【双向dp】NOIP提高组2008传纸条
- 壳(加密了IAT)
- ios 开发中 --做登陆注册时编译出现的错误和解决方法
- java中equals和==区别小结
- 表达式求值
- hdu-5673 Robot(默次金数)
- 两台服务器建立信任关系(root,普通用户)
- FIFO页面置换
- CNNs学习笔记(5): CNNs详细理解 Part1
- HDOJ(HDU) 1985 Conversions(汇率转换)
- UVa 10071 Back to High School Physics
- 基于功能安全标准IEC61508的嵌入式设计流程
- 字符串问题经典问题
- HDOJ(HDU) 1985 Conversions(汇率转换)
- 数据结构报告
- 趣味素数-金蝉素数-java
- Java基础数据结构和算法
- gulp:更简单的自动化构建工具
- JavaMelody应用监控使用指南
- win 7下卸载Apache