您的位置:首页 > 其它

LeetCode记录之——3sum

2014-10-26 00:00 465 查看
在LeetCode上也写了有30多道题了,可是之前一直没有记录,看到以前做过的一些的题,仍是不能立刻就想到以前的思路和想法,所以从今天起开始进行记录吧,哪怕从写题的时间被压缩一点,也要完成记录。wwhh 加油!

在这里定个目标吧,研一期间要把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