leetcode组合问题

Contents

leetcode.77 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。

背后数学描述无需多言。首先找个简单例子枚举所有组合,例如:4, 2 所有可能为(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)。可以看出具有很明显的树状结构,那就可以先画一颗树的草图,如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
func combine(n int, k int) [][]int {
    ans := [][]int{} // 记录答案
    cur := []int{} //记录当前个数
    var dfs func(int, int)
    dfs = func(index int, depth int) {
        // 递归深度为k
        if len(cur) == k {
            ans = append(ans, append([]int{}, cur...)) // 注意此处appen写法,详见golang slice扩容细节
            return
        }
        for j := index+1; j <= n - depth + 1; j++ { // 这里实际上进行了剪枝,看图比较直观
            cur = append(cur, j)
            dfs(j, depth-1)
            cur = cur[0: len(cur) - 1] //回溯
        }
    }
    dfs(0, k)
    return ans
}