重点:去重操作、判断和为0之后不要忘记left++和right- -
int i = 0; i < len; i++也可优化为int i = 0; i < len - 2; i++
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums == null) {
return res;
}
int len = nums.length;
if(len < 3) {
return res;
}
Arrays.sort(nums);
for (int i = 0; i < len; i++) {
if(nums[i] > 0) {
break;
}
if (i > 0 && nums[i] == nums[i - 1]) {
continue; //去重
}
int left = i + 1;
int right = len - 1;
while(left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
res.add(Arrays.asList(nums[i], nums[left], nums[right]));
while(left < right && nums[left] == nums[left + 1]) { //在三数范围内去重
left++;
}
while(left < right && nums[right] == nums[right - 1]) {
right--;
}
left++;
right--;
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return res;
}
}