DB真题 2020-06-18 40. Combination

2020-06-18  本文已影响0人  苦庭

https://leetcode.com/problems/combination-sum-ii/
字节跳动真题:数组、回溯、递归、

My answer / AC

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */

var combinationSum2 = function(candidates, target) {
    candidates = candidates.sort();
    var path = [];
    var res = [];
    dfs_com(candidates, 0, target, path, res);
    return res;
}

function dfs_com(cand, cur, target, path, res) {
    if(target == 0) {
        res.push(path.slice());
        return;
    }
    if(target<0) return; //只要target小于0就在这里截至
    for(var i=cur; i<cand.length; i++){
        if(i>cur && cand[i]==cand[i-1]) continue;
        path.push(cand[i]);
        dfs_com(cand, i+1, target-cand[i], path, res);
        path.pop();
    }
}

抄java的solution的0_0
每天问自己:深度遍历,我学会了吗!!

Best Solution

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum2 = function(candidates, target) {
    candidates.sort((a,b)=>a-b);
    
    let res = [];
    let dfs = function(id, n, comb) {
        if (n == 0) {
            res.push(comb);
            return;
        }
        
        for (let i=id;i<candidates.length;i++) {
            if (candidates[i] <= n) { //在这里判断以防止传入小于0的target
                dfs(i+1, n - candidates[i], [...comb, candidates[i]]);
            }
            while(candidates[i+1]==candidates[i])i++;
        }
        return res;
    }
    
    dfs(0, target, []);
    return res;
};

原理都是一模一样的,都是在当前的哪个之后实现深度遍历。但是这个写法要优雅许多。

然而在防止target<0的处理上,前面的那个写法性能要稍微好一点点。

Recap

只能反复练练了。。。

上一篇下一篇

猜你喜欢

热点阅读