这道题的复杂度是O(n^2)。问题是这样的,如果我取中间,然后再左右各取的话,去重虽然不会增加复杂度,但是最后leetcode结果还是会超时。
最后优化的解法是这样的,取最左边的值,然后在取两个后面的值,这样可以用一些技巧去重,不用再单独去重了
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new LinkedList<List<Integer>>();
if (nums.length < 3) {
return result;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
// 关键
if(i==0 || nums[i] > nums[i-1]) {
int target = -nums[i];
int p = i+1;
int q = nums.length - 1;
while (p<q) {
if (nums[p] + nums[q] < target) {
p++;
} else if (nums[p] + nums[q] > target) {
q--;
} else {
List<Integer> item = new ArrayList<Integer>();
item.add(nums[i]);
item.add(nums[p]);
item.add(nums[q]);
result.add(item);
p++;
q--;
// 关键
while(p<q && nums[p]==nums[p-1])
p++;
while(p<q && nums[q]==nums[q+1])
q--;
continue;
}
}
}
}
return result;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。