貪吃蛇5.0
阿新 • • 發佈:2020-09-07
組合
給定兩個整數n
和k
,返回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
構建一個新陣列傳遞到下一個遞迴中,之後啟動遞迴初始化cur
為1
,深度deep
為0
,tmp
為一個空陣列,遞迴完成後返回目標陣列即可。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://leetcode-cn.com/problems/combinations/