【力扣】nSum问题模板
nSum问题模板
两数之和、三数之和、四数之和。
private List<List<Integer>> nSum(int[] nums, long target, int start, int n) {
int len = nums.length;
List<List<Integer>> res = new LinkedList<>();
if(len < 2 || len < n) return res;
if(n == 2){
int left = start, right = len - 1;
while(left < right){
int sum = nums[left] + nums[right];
int low = nums[left], high = nums[right];
if(sum == target){
res.add(new LinkedList<>(Arrays.asList(nums[left],nums[right])));
while (left < right && nums[left] == low) left++;
while (left < right && nums[right] == high) high--;
}else if(sum > target){
right--;
}else if(sum < target){
left++;
}
}
return res;
}else {
for(int i = start; i < len; i++){
if(i - 1 >= start && nums[i] == nums[i - 1]) continue;
List<List<Integer>> sub = nSum(nums, target - nums[i], i + 1, n - 1);
for(List<Integer> arr : sub){
arr.add(nums[i]);
res.add(new LinkedList<>(arr));
}
}
return res;
}
}
15. 三数之和
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
return nSum(nums, 0, 0, 3);
}
private List<List<Integer>> nSum(int[] nums, long target, int start, int n) {...}
}
18. 四数之和
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
return nSum(nums, target, 0, 4);
}
private List<List<Integer>> nSum(int[] nums, long target, int start, int n) {...}
}