列表

详情


77. 组合

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

 

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]

 

提示:

相似题目

组合总和

全排列

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<vector<int>> combine(int n, int k) { } };

golang 解法, 执行用时: 8 ms, 内存消耗: 5.9 MB, 提交时间: 2023-06-16 09:51:17

func combine(n, k int) (ans [][]int) {
    path := []int{}
    var dfs func(int)
    dfs = func(i int) {
        d := k - len(path) // 还要选 d 个数
        if d == 0 {
            ans = append(ans, append([]int(nil), path...))
            return
        }
        // 不选 i
        if i > d {
            dfs(i - 1)
        }
        // 选 i
        path = append(path, i)
        dfs(i - 1)
        path = path[:len(path)-1]
    }
    dfs(n)
    return
}

python3 解法, 执行用时: 48 ms, 内存消耗: 17.6 MB, 提交时间: 2023-06-16 09:50:52

# 选或不选
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        ans = []
        path = []
        def dfs(i: int) -> None:
            d = k - len(path)  # 还要选 d 个数
            if d == 0:
                ans.append(path.copy())
                return
            # 不选 i
            if i > d: dfs(i - 1)
            # 选 i
            path.append(i)
            dfs(i - 1)
            path.pop()
        dfs(n)
        return ans

python3 解法, 执行用时: 52 ms, 内存消耗: 17.6 MB, 提交时间: 2023-06-16 09:50:14

# 枚举下一个数选哪个
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        ans = []
        path = []
        def dfs(i: int) -> None:
            d = k - len(path)  # 还要选 d 个数
            if d == 0:
                ans.append(path.copy())
                return
            for j in range(i, d - 1, -1):
                path.append(j)
                dfs(j - 1)
                path.pop()
        dfs(n)
        return ans

golang 解法, 执行用时: 4 ms, 内存消耗: 6.3 MB, 提交时间: 2021-07-22 10:30:44

func combine(n int, k int) (ans [][]int) {
	// 末尾加一位 n + 1 作为哨兵
	temp := make([]int, k+1)
	for i := 1; i <= k; i++ {
		temp[i-1] = i
	}
	temp[k] = n+1

	for j := 0; j < k; {
		comb := make([]int, k)
		copy(comb, temp[:k])
		ans = append(ans, comb)
		// 寻找第一个 temp[j] + 1 != temp[j + 1] 的位置 t
		// 我们需要把 [0, t - 1] 区间内的每个位置重置成 [1, t]
		for j = 0; j < k && temp[j]+1 == temp[j+1]; j++ {
			temp[j] = j + 1
		}
		// j 是第一个 temp[j] + 1 != temp[j + 1] 的位置
		temp[j]++
	}
	return
}

上一题