如何查找数组中元素和等于指定数值的所有长度的有效组合
实现方案
你当前的两层循环只能处理固定长度为2的组合,要支持任意长度的符合要求的组合查询,使用回溯算法即可实现。
代码实现
function solution(arr, target) { const result = [] // 回溯参数:当前累计和、当前选中的元素组合、下一次选元素的起始索引 const backtrack = (currentSum, currentComb, startIndex) => { // 累计和匹配目标值,存入结果 if (currentSum === target) { result.push([...currentComb]) } // 剪枝:累计和已超过目标值,无需继续添加元素 if (currentSum > target) { return } // 从起始索引开始遍历,避免生成顺序不同的重复组合 for (let i = startIndex; i < arr.length; i++) { currentComb.push(arr[i]) backtrack(currentSum + arr[i], currentComb, i + 1) // 回溯撤销当前选择 currentComb.pop() } } backtrack(0, [], 0) return result }
逻辑说明
- 每次选择元素都从当前索引的下一位开始,不会出现如
[2,3]和[3,2]这类顺序不同的重复组合 - 匹配到目标和时对当前组合做浅拷贝再存入结果,避免后续回溯操作修改已存入的结果
- 匹配到目标和时不直接终止递归,保证加0后和仍为目标值的组合(如
[2,3]和[2,3,0])可以被正常收录
测试效果
输入示例arr = [2,4,1,3,0,1]、target = 5时,输出结果为:[[2,3],[2,3,0],[4,1],[4,1,0],[1,3,1],[1,3,1,0]]
你给出的示例中遗漏了[1,3,1],该组合元素和为1+3+1=5,属于合法符合要求的组合。
内容的提问来源于stack exchange,提问作者codeNewBie
相关产品推荐
相关产品推荐

