组合

题目描述:给出两个整数n和k,返回从1......n中选出的k个数的组合。

样例:例如 n = 4 且 k = 2,返回的解为:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]


深搜+递归的思路。与之前求取“二叉树的所有路径”如出一辙(详见:点击打开链接)。可以这样理解:拿样例来说:

1. 先将1放入组合:[1] 那么剩下的数只能在2, 3, 4中选择,因为k = 2,所以,我们只需要在2, 3, 4中选择一个就行,也就是[1, 2], [1, 3], [1, 4];

2. 将2放入组合:[2],因为1已经处理过,所以在3, 4中选择一个:[2, 3], [2, 4]

3. 将3放入组合:[3],因为1, 2已经处理过,所以只能选择4:[3, 4]


所以,根据这个思路,我们可以写一个辅助函数helper(),helper()有4个参数做,做2件事情:

4个参数:

(1) begin:开始的位置。从这个位置开始,处理之后部分数组的可能的组合

(2) path:组合的“半成品”,例如样例中,我们先把1加入,形成了数组[1],这个数组[1]显然是未来加入列表的一个“半成品”

(3) result:结果列表,存储“成型”(也就是长度为k)的组合

(4) k

做2件事情:

(1) 当path的长度等于k时,将这个path加入result

(2) 当path的长度小于k时,为path依次加入(从begin位置开始一直到最后)数组中的元素,每加入一个元素,就带着这个更新过的“半成品”path递归执行helper()函数,只不过,此时,begin变为begin + 1,比如样例中,先将1加入,带着“半成品”[1]进入以2为起点的helper()函数,形成结果[1, 2], [1, 3], [1, 4];再以[2]为“半成品”,进入以3为起点的helper()函数......以此类推。

这就像是一棵多叉树的深搜一般,找出所有的路径。


代码如下:

class Solution:
    """
    @param n: Given the range of numbers
    @param k: Given the numbers of combinations
    @return: All the combinations of k numbers out of 1..n
    """
    def combine(self, n, k):
        path = []
        result = []
        begin = 1
        self.helper(k, begin, n, path, result)
        return result

    def helper(self, k, begin, n, path, result):
        if len(path) == k:
            # 复制数组
            temp = path[:]
            result.append(temp)
            return
        # 遍历从cur到最后的数字
        for i in range(begin, n + 1):
            path.append(i)
            # 从下一位开始到最后的组合情况
            self.helper(k, i + 1, n, path, result)
            path.remove(i)
        # write your code here



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值