组合

题目描述

来源于 https://leetcode-cn.com/

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

示例:

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

解法:

遇到组合问题,我就只能想到深度优先去遍历解空间。

每一个分支下面的节点可取值的范围需要设置的恰当,避免无意义的搜索。比如第一层就不应该有 4,否则第二层就没得可选的数字了。每个分支下面的可选数字范围为[父节点+1, n-k+depth]

k=2, n=4

  1      2    3    -- depth=1 
 /|\    / \   |
2 3 4  3   4  4    -- deoth=2
| | |  |   |  |
1 1 1  2   2  3   
2 3 4  3   4  4
def combine(self, n, k):
    """
    :type n: int
    :type k: int
    :rtype: List[List[int]]
    """

    results = []

    def __combine(i, depth, comb):
        if depth == k + 1:
            results.append(comb)
            return
        for i in range(i, n - k + depth + 1):
            __combine(i + 1, depth + 1, comb + [i])

    __combine(1, 1, [])

    return results