给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
思路
- 递归,列出所有组合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var combine = function (n, k) { const result = [] const handler = (items, curIndex) => { if (items.length === k) { result.push(items) return } if (curIndex > n) { return } handler([...items], curIndex + 1) handler([...items, curIndex], curIndex + 1) } handler([], 1) return result }
|
改进思路
- 模拟数字递增的结果输出
- 实现 incItems 方法,而后枚举添加到结果中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| var combine = function (n, k) { const incItems = (items) => { items = [...items] let keyIndex = items.length - 1 while (keyIndex >= 0 && items[keyIndex] + (items.length - 1 - keyIndex) >= n) { --keyIndex } if (keyIndex < 0) { return null } ++items[keyIndex] for (let j = keyIndex + 1; j < items.length; ++j) { items[j] = items[j - 1] + 1 } return items } const result = [] let keyItems = new Array(k).fill(null).map((_, index) => index + 1) while (keyItems) { result.push(keyItems) keyItems = incItems(keyItems) } return result }
|