015,3|015,3 Sum

【015,3|015,3 Sum】给定一个数组S,它包含n个整数,它是否存在3个元素a,b,c,满足a+b+c=0?找出所有满足条件的元素数组。
提示:a,b,c三个元素必须是升序排列(也就是满足a ≤ b ≤ c),最终的结果不能包含重复的元素数组。例如给定S为{-1 0 1 2 -1 -4},返回结果是(-1, 0, 1)和(-1, -1, 2)。
http://blog.csdn.net/lnho2015/article/details/51314133]
暴力,三次for循环遍历解决问题
http://blog.csdn.net/hcbbt/article/details/44041671
分析:
先排序,再左右夹逼,复杂度 O(n*n)。
N-sum 的题目都可以用夹逼做,复杂度可以降一维。

public class Solution {public List> threeSum(int[] num) { List> ret = new ArrayList>(); int len = num.length, tar = 0; if (len <= 2) returnret; Arrays.sort(num); for (int i = 0; i <= len - 3; i++) { // first number : num[i] int j = i + 1; // second number int k = len - 1; // third number while (j < k) { if (num[i] + num[j] + num[k] < tar) { ++j; } else if (num[i] + num[j] + num[k] > tar) { --k; } else { ret.add(Arrays.asList(num[i], num[j], num[k])); ++j; --k; // folowing 3 while can avoid the duplications//保证没有重复元素 while (j < k && num[j] == num[j - 1]) ++j; while (j < k && num[k] == num[k + 1]) --k; } } while (i <= len - 3 && num[i] == num[i + 1]) ++i; } return ret; } }

    推荐阅读