题目:https://oj.leetcode.com/problems/3sum/
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)分析:先排序,然后左右夹逼,复杂度O(n2)。这个方法可以推广到k-sum,先排序,然后做k ..2 次循环,在最内层循环左右夹逼,时间复杂度是:
源码:Java版本
算法分析:先排序,然后左右夹逼。时间复杂度O(n^2),空间复杂度O(1)
public class Solution {
public List<List<Integer>> threeSum(int[] num) {
if(num==null) {
return null;
}
Set<List<Integer>> results=new HashSet<List<Integer>>();
Arrays.sort(num);
int k=3,low,high;
for(int i=0;i<num.length-(k-1);i++) {
low=i+1;
high=num.length-1;
while(low<high) {
if(num[i]+num[low]+num[high]>0) {
high--;
}else if(num[i]+num[low]+num[high]<0) {
low++;
}else { //equals
List<Integer> list=new ArrayList<Integer>();
list.add(num[i]);
list.add(num[low]);
list.add(num[high]);
low++;
high--;
results.add(list);
}
}
}
return new ArrayList<List<Integer>>(results);
}
}