适用于:
//例如 求两数和
Arrays.sort(nums);
return nSumTarget(nums, 2, 0, target);
n数之和模板
//传入的数组需有序,有序才能使用二分法
//n为n数和 start为起始索引 tartget为所求的和
public List<List<Integer>> nSumTarget(int[] nums, int n, int start, int target){
List<List<Integer>> res = new ArrayList<>();
int len = nums.length;
if(n < 2 || len < n) return res;
//求两数之和
if(n == 2){
int lo = start, hi = len - 1;
//这里不能有等于 lo不能等于hi 否则会出现重复元组
while(lo < hi){
int sum = nums[lo] + nums[hi];
int left = nums[lo], right = nums[hi];
if(sum < target){
//去重
while(lo < hi && nums[lo] == left) lo++;
} else if(sum > target){
//去重
while(lo < hi && nums[hi] == right) hi--;
} else{
//加入结果集
List<Integer> list = new ArrayList<>();
list.add(left);
list.add(right);
res.add(list);
//去重
while(lo < hi && nums[lo] == left) lo++;
while(lo < hi && nums[hi] == right) hi--;
}
}
} else {
//n数和 n大于2 在n-1数和的基础上递归求 n数和 比如求三数和是在 两数和的基础上 每次固定一个数,然后求两数和
for(int i = start; i < len; i++){
List<List<Integer>> sub = nSumTarget(nums, n - 1, i + 1, target - nums[i]);
for(List<Integer> arr: sub){
arr.add(nums[i]);
res.add(arr);
}
//去重
while(i < len - 1 && nums[i + 1] == nums[i]) i++;
}
}
return res;
}
整理思路,记录博客,以便复习。若有误,望指正~