K Sum模板:
*如果返回特定index,用HashMap *如果返回组合本身且 K > 2, 无论如何先Arrays.sort(nums), 再降为TwoSum问题(指针对撞) public int[] twoSumII(int[] numbers, int target) { int i = 0; int j = numbers.length - 1; while (i < j) { int sum = numbers[i] + numbers[j]; if (sum < target) { i++; } else if (sum > target) { j--; } else { return new int[]{i + 1, j + 1}; } } return null; }
K Sum高频题:
[Leetcode]167. Two Sum II - Input array is sorted 两数之和II
public int[] twoSumII(int[] numbers, int target) { int i = 0; int j = numbers.length - 1; while (i < j) { int sum = numbers[i] + numbers[j]; if (sum < target) { i++; } else if (sum > target) { j--; } else { return new int[]{i + 1, j + 1}; } } return null; }
public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); int target = 0; Arrays.sort(nums); //先排序 // corner case if (nums.length < 3) return result; for (int i = 0; i < nums.length; i++) { if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicates int j = i + 1; int k = nums.length - 1; while (j < k) { if (nums[i] + nums[j] + nums[k] < target) { j++; while (j < k && nums[j] == nums[j - 1]) j++; // skip duplicates } else if (nums[i] + nums[j] + nums[k] > target) { k--; while (j < k && nums[k] == nums[k + 1]) k--; // skip duplicates } else { result.add(Arrays.asList(nums[i], nums[j], nums[k])); j++; k--; while (j < k && nums[j] == nums[j - 1]) j++; // skip duplicates while (j < k && nums[k] == nums[k + 1]) k--; // skip duplicates } } } return result; }
[leetcode]16. 3Sum Closest最接近的三数之和
public int threeSumClosest(int[] num, int target) { int result = 0; int minGap = Integer.MAX_VALUE; Arrays.sort(num); for (int i = 0; i < num.length - 2; ++i) { int j = i + 1; int k = num.length - 1; while (j < k) { int sum = num[i] + num[j] + num[k]; int gap = Math.abs(sum - target); if (gap < minGap) { result = sum; minGap = gap; } if (sum < target) { j++; } else { k--; } } } return result; }
[leetcode]259. 3Sum Smaller 三数之和小于目标值
public int threeSumSmaller(int[] nums, int target) { if (nums == null || nums.length == 0) return 0; int result = 0; Arrays.sort(nums); for (int i = 0; i < nums.length - 2; i++) { int j = i + 1; int k = nums.length - 1; while (j < k) { int sum = nums[i] + nums[j] + nums[k]; if (sum < target) { result += k - j; j++; } else { k--; } } } return result; }
public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayList<>(); if (nums.length < 4) return result; // corner case Arrays.sort(nums); for (int i = 0; i < nums.length - 3; i++) { if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicates for (int j = i + 1; j < nums.length - 2; j++) { if (j > i + 1 && nums[j] == nums[j - 1]) continue; // skip duplicates int k = j + 1; int l = nums.length - 1; while (k < l) { int sum = nums[i] + nums[j] + nums[k] + nums[l]; if (sum < target) { k++; while (nums[k] == nums[k - 1] && k < l) k++; // skip duplicates } else if (sum > target) { l--; while (nums[l] == nums[l + 1] && k < l) l--; // skip duplicates } else { result.add(Arrays.asList(nums[i], nums[j], nums[k], nums[l])); k++; l--; while (nums[k] == nums[k - 1] && k < l) k++; // skip duplicates while (nums[l] == nums[l + 1] && k < l) l--; // skip duplicates } } } } return result; }