p15,三数之和,双指针法,java版
public static List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums);/*对数组进行排序*/ List<List<Integer>> lists = new ArrayList<>(); for (int i = 0; i < nums.length - 2; i++) {/*遍历数组作为第一个数*/ if (nums[i] > 0) break; /*第一个数大于 0,后面的数都比它大,肯定不成立了*/ if (i > 0 && nums[i] == nums[i - 1]) continue;/*排除重复遍历同一个数情况*/ int left = i + 1;/*定义左指针*/ int right = nums.length - 1;/*定义右指针*/ while (left < right) { if (nums[i] + nums[left] + nums[right] > 0) {/*如果和大于0,说明右指针应该左移*/ right--; } else if (nums[i] + nums[left] + nums[right] < 0) {/*如果和小于0,说明左指针应该右移*/ left++; } if (nums[i] + nums[left] + nums[right] == 0 && left != right) {/*如果和等于0,且左右指针不相等,存入数组*/ List<Integer> arr = new ArrayList<>(); arr.add(nums[i]); arr.add(nums[left]); arr.add(nums[right]); if (!lists.contains(arr)) {/*如果是不重复的集合,则添加*/ lists.add(arr); } left++;/*必须移动左或右指针,否则跳不出循环,而且同一i可能存在两个符合要求的集合*/ } } } return lists; }