重点:去重操作、判断和为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; } }