思路:这题跟15题,最接近的三数之和很像,但是难点在于去重。
注意点:
当 nums[i]+nums[L]+nums[R]==0时,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解
优化:如果 nums[i]大于 0 则三数之和必然无法等于 0 ,结束循环
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
if (nums.length < 3) return res;
int n = nums.length;
for (int i = 0; i < n; i++) {
if (nums[i] > 0) break;
// 去重
if (i > 0 && nums[i] == nums[i - 1]){
continue;
}
int l = i + 1, r = n - 1;
while (l < r){
int sum = nums[i] + nums[l] + nums[r];
if (sum == 0){
// 注意添加数组的方式
res.add(Arrays.asList(nums[i],nums[l],nums[r]));
l++;
while (l < r && nums[l] == nums[l - 1]) l++;
r--;
// 去重
while (l < r && nums[r] == nums[r + 1]) r--;
}else if (sum < 0){
l++;
}else {
r--;
}
}
}
return res;
}
}