求和为target的数字组合
题目:现给定⼀个整数数组(数组⻓度⼤于等于 5)nums 和⼀个整数⽬标值 target,请你在该数组中
找出和为⽬标值 target 的那 n(n<nums.length) 个整数,并返回它们的数组(如果有多个下标组合
都满⾜,则返回下标和最⼩的那⼀组)的下标。
注意:数组中同⼀个元素在答案⾥不能重复出现。 ⽐如输⼊:nums = [3,2,4,5,7],n=3,
target = 10 输出:[0,1,3]
答案from ChatGPT:
function combinationSum(nums, n, target) { let result = []; let combination = []; function backtrack(start, target) { if (target === 0 && combination.length === n) { result.push([...combination]); return; } for (let i = start; i < nums.length; i++) { if (target < nums[i]) { break; } combination.push(i); backtrack(i + 1, target - nums[i]); combination.pop(); } } backtrack(0, target); return result[0]; }
个人对此代码的理解:
比如输⼊:nums = [0,1,2,3,4,5,6,7,8,9],n=4,target = 12
按题目要求即从nums中选择4个数,并且其和为12,根据中学时学习的数学组合可知,选择第一个数时nums中有10个数,有10种选择,代码中表示为第一层for循环,当第一个数字选定以后,选择第二个数的时候还剩9个数,我们可以从这9个数中选择1个,即代码中的递归回调中的for循环...以此类推。最后筛选出符合条件的数字组合。因为这是组合,并非排列,没有顺序要求,所以数字选取直接一轮一轮向后挑选即可,代码中表示为i + 1。数字组合如下:
0123,0124,0125,0126,0127,0128,0129
0134,0135,0136,0137,0138,0139
0145,0146,0147,0148,0149
0156,0157,0158,0159
......
0234,0235,0236,0237,0238,0239
0245,0246,0247,0248,0249
......
1234,1235,1236,1237,1238,1239
......