77. 组合

115 阅读1分钟

77. 组合

dfs + 剪枝

dfs(1, []); 1~n,从1开始分支,分两种情况:

  1. 选了1
  2. 没有选1 选了1了,进一步从2开始,又分两种情况,选了2和没有选2....等,直到长度到k了则pushres

在此过程中,存在坏的分支情况,需要过滤掉,如下 if (arr.length + (n - i + 1) < k) return; 解释为已入选的个数 + 剩下候选的个数 < k了,需要裁掉,因为不管怎么选都不能满足 === k的要求

var combine = function (n, k) {
    var res = [];
    dfs(1, []);
    return res;
    function dfs(i, arr) {
        if (arr.length + (n - i + 1) < k) return;
        if (arr.length == k) {
            res.push(arr);
            return;
        }
        dfs(i + 1, [...arr, i]);
        dfs(i + 1, arr);
    }
};

题目要求的1-n数组太过特殊,我们可以进行数组一般化,再进一步求解

var combine = function (n, k) {
    var brr = []
    for (var j = 1; j <= n; j++) {
        brr.push(j)
    }
    var len = brr.length
    var res = [];
    dfs(0, []);
    return res;
    function dfs(i, arr) {
        if (arr.length + (len - i) < k) return;
        if (arr.length == k) {
            res.push(arr);
            return;
        }
        dfs(i + 1, [...arr, brr[i]]);
        dfs(i + 1, arr);
    }
};