class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
results = []
target_pre = None
nums.sort()
for index_i in range(len(nums)-2):
sums = set()
j_pre = None
target = -nums[index_i]
if target == target_pre:
continue
else:
target_pre = target
for j in nums[index_i+1:]:
if j == j_pre:
continue
if target-j in sums:
if j < target-j:
results.append([-target,j,target-j])
else:
results.append([-target,target-j,j])
j_pre = j
else:
sums.add(j)
return results
基于set的并不优雅的O(N*N*lgN)算法,
一个O(N*N)算法:
public List<List<Integer>> threeSum(int[] num)
{
ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
Arrays.sort(num);
for (int i=0; i < num.length; i++) {
int start = i + 1, end = num.length-1;
while (start < end) {//Two pointers
int sum = num[i] + num[start] + num[end];
if (sum == 0) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(num[i]);
list.add(num[start]);
list.add(num[end]);
result.add(list);
start++;
end--;
while((start < end) && num[start] == num[start-1]) start++; //remove duplicates
while((start < end) && num[end] == num[end+1]) end--;
}
else if (sum < 0) {
start++;
while((start < end) && num[start] == num[start-1]) start++; //remove duplicates
} else {
end--;
while((start < end) && num[end] == num[end+1]) end--; //remove duplicates
}
}
while (i+1 < num.length && num[i+1] == num[i]) //remove duplicates
i++;
}
return result;
}