LeetCode记录之——3sum
2014-10-26 00:00
465 查看
在LeetCode上也写了有30多道题了,可是之前一直没有记录,看到以前做过的一些的题,仍是不能立刻就想到以前的思路和想法,所以从今天起开始进行记录吧,哪怕从写题的时间被压缩一点,也要完成记录。wwhh 加油!
在这里定个目标吧,研一期间要把LeetCode上的题全部做完。
今天的题目:3sum
在做这道题时,发现自己进入了一个误区,就是看到题就直接想去找到一种很取巧的方法,而这恰恰是最笨的方法,因为我不是天才,做题的经验也不多,是很错误的一个想法。因此以后做题的时候,可能一时想不出好的方法,但可以从最笨的方法开始,想着去简化、优化,也是不错的办法。
这道题的思路就是针对数组中每个值,在数组中寻找有没有与之对应的两个数,使和满足要求。一次性在数组中搜索3个数不现实,但只要是有序数组中2个数的搜索还是有一定的办法简化到O(n)的。
还有一点,就是关于List的运用,由于一个数可能有多余1组的数和它对应,导致不能用map,而我却一直试图用map,真是有点可笑,只要格式一样,用List来保存自己想要的结果也是一样的啊。
代码:
在这里定个目标吧,研一期间要把LeetCode上的题全部做完。
今天的题目:3sum
在做这道题时,发现自己进入了一个误区,就是看到题就直接想去找到一种很取巧的方法,而这恰恰是最笨的方法,因为我不是天才,做题的经验也不多,是很错误的一个想法。因此以后做题的时候,可能一时想不出好的方法,但可以从最笨的方法开始,想着去简化、优化,也是不错的办法。
这道题的思路就是针对数组中每个值,在数组中寻找有没有与之对应的两个数,使和满足要求。一次性在数组中搜索3个数不现实,但只要是有序数组中2个数的搜索还是有一定的办法简化到O(n)的。
还有一点,就是关于List的运用,由于一个数可能有多余1组的数和它对应,导致不能用map,而我却一直试图用map,真是有点可笑,只要格式一样,用List来保存自己想要的结果也是一样的啊。
代码:
public class Solution { public List<Integer> find(int[] num, int start, int key){ List<Integer> result = new ArrayList<Integer>(); int p = start; int q = num.length - 1; //当初很笨的写成了 q = k,以后一定要注意这种事情的发生。 while(p < q){ //之前写成 p != q ,感觉是自己不好的习惯,代码和逻辑不能对应上,有些偷懒,以后一定要认真 if(num[p] + num[q] < key){ p++; } else if(num[p] + num[q] > key){ q--; } //这里else当初也被自己给省略了,真是无语了 else{ result.add(p); result.add(q); while(p < q && num[p] == num[p+1]){ //这里的条件不能省,在循环里面写循环一定要注意到对外层循环条件的控制 p++; } p++; //这里一定要写在while的后面,否则会产生错误,如 num = [0,1,1,2],因为逻辑是先处理当前 p,然后把重复的p都略过去,然后再进行前进操作 q--; } } return result; } public List<List<Integer>> threeSum(int[] num){ List<List<Integer>> res = new ArrayList<List<Integer>>(); Arrays.sort(num); int len = num.length; for(int i = 0; i < len-2; i++){ List<Integer> two = find(num, i+1, -num[i]); for(int j = 0; j < two.size(); j+=2){ List<Integer> t = new ArrayList<Integer>(); t.add(num[i]); t.add(num[two.get(j)]); t.add(num[two.get(j+1)]); res.add(t); } while(i+1 < len && num[i] == num[i+1]) {i++;} } return res; } }
相关文章推荐
- 【Leetcode解题记录】15. 3Sum
- Leetcode习题记录——3Sum Closest
- LeetCode记录之——3Sum Closest
- 个人记录-LeetCode 15. 3Sum
- [LeetCode] 3Sum
- Leetcode: 3SUM Closest
- LeetCode :3Sum
- [Leetcode] 3sum
- Leetcode: 3SUM
- LeetCode Online Judge 题目C# 练习 - 3SUM
- LeetCode 16: 3Sum Closest
- leetcode 57: 3Sum Closest
- LeetCode 3Sum Closest
- leetcode - 3Sum
- leetcode 120: 3Sum
- Leetcode 15 3Sum
- LeetCode : 3Sum Closest
- [Leetcode]3Sum Closest
- [Leetcode]3Sum
- LeetCode: 3Sum