在i的循环里维护两个指针,保证得到的解唯一,需要注意的就是去重复
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length-2; i++) {
if (i == 0 || nums[i] != nums[i-1]) {
int j = i+1;
int k = nums.length-1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (sum == 0) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
res.add(list);
j++;
while (j < nums.length && nums[j] == nums[j-1])
j++;
k--;
while (k > 0 && nums[k] == nums[k+1])
k--;
}
if (sum > 0) {
k--;
while (k > 0 && nums[k] == nums[k+1])
k--;
}
if (sum < 0) {
j++;
while (j < nums.length && nums[j] == nums[j-1])
j++;
}
}
}
}
return res;
}