JavaScript|LeetCode|搜索|39.组合总和

本文介绍了一种使用回溯法解决组合总和问题的方法。通过将候选数字降序排列,可以有效避免不必要的组合尝试,提高算法效率。具体实现包括了如何递归地寻找可能的数字组合,以达到目标总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

法1:回溯
想法:

  1. 将candidates降序排列,当前数字大于target,则不使用该数字作为组合的第一个数字(跳过该数字)
  2. 遇到一个数字<=target,则对小于等于它的剩余数字进行组合,使得组合的和等于新的target,即target-该数字
/** 
* @param {number[]} candidates 
* @param {number} target 
* @return {number[][]} 
*/
var combinationSum = function(candidates, target) {    
    var output = [], temp = [];    
    
    // 将candidates中数字降序排列
    candidates.sort(function(a, b) {return b - a;});
    var i = 0;    
    for(i = 0; i < candidates.length; i++) {        
        if(candidates[i] > target) {
            // 当前数字大于target,则含有该数字的组合不可能是结果            
            continue;        
        }        
        temp.push(candidates[i]);        
        doCombinationSum(candidates.slice(i), target - candidates[i], temp, output);        
        temp.pop();    
    }    
    return output;
};

function doCombinationSum(candidates, target, temp, output) {    
    if(target == 0) { // temp中数字和满足条件        
        output.push(temp.concat([]));        
        return;    
    }    
    var i = 0;    
    for(i = 0; i < candidates.length; i++) {        
        if(candidates[i] > target) {            
            // 当前数字大于target,则含有该数字的组合不可能是结果
            continue}        
        temp.push(candidates[i]);        
        doCombinationSum(candidates.slice(i), target - candidates[i], temp, output);        
        temp.pop();    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值