1. 程式人生 > 實用技巧 >貪吃蛇5.0

貪吃蛇5.0

組合

給定兩個整數nk,返回1 ... n中所有可能的k個數的組合。

示例

輸入: n = 4, k = 2
輸出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

題解

/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
    if(n <= k) return [[...new Array(n).keys()].map(v => v+1)];
    var target = [];
    var dfs = function(cur, deep, tmp){
        if (tmp.length + (n - cur + 1) < k) return void 0;
        if(deep === k){
            target.push(tmp);
            return void 0;
        }
        for(;cur<=n;++cur) dfs(cur+1, deep+1, [...tmp, cur]);
    }
    dfs(1, 0, []);
    return target;
};

思路

以示例中的值為例,可以認為是一個長度為4的陣列[1, 2, 3, 4],每兩個組合一個數組可取1組合其陣列中之後的值,2與其陣列中之後值,3與其陣列中之後的值,4與其陣列中之後值,即[1, 2][1, 3][1, 4][2, 3][2, 4][3, 4],首先初始條件判斷,若是n <= k則只能構成一個長度為n的陣列,將其裝入二維陣列返回即可,後邊的表示式利用了new Array(n)生成了一個長度為n的空陣列,讓後取得其keys的迭代器,利用...Spread操作符將其展開,之後使用map將其處理為key+1,之後定義目標陣列,之後定義dfs遞迴函式,首先進行剪枝,如果當前tmp

陣列的大小為s,未確定狀態的區間[cur,n]的長度為t,如果s + t < k,那麼即使t個都被選中,也不可能構造出一個長度為k的序列,故這種情況就沒有必要繼續向下遞迴,之後判斷遞迴深度如果與k相等則直接將tmp陣列置入目標陣列並返回,之後定義一個迴圈,從cur開始到n進行遞迴取值,將tmp陣列與cur構建一個新陣列傳遞到下一個遞迴中,之後啟動遞迴初始化cur1,深度deep0tmp為一個空陣列,遞迴完成後返回目標陣列即可。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://leetcode-cn.com/problems/combinations/