Combinations

来源:互联网 发布:最近网络流行歌曲2017 编辑:程序博客网 时间:2024/04/29 23:57

leetcode第77题,排列组合题升级版,这个题的总体难度不太大,但是鉴于使用的是python,如果不剪枝,就一定会超时。

首先分析问题,先要按顺序挑选出开头的元素,此时所给集合中的所有元素均可以添加,然后把加上了开头元素的列表向下递归,添加第二个元素,第二个元素的要求应该是第一个元素之后的所有元素均可,同时记录递归层级的变量level自增。递归的出口条件是,当level达到了指定的个数后,数名数字添加完毕,则可以加入最终的结果列表中。

如果单纯这样写结果正确,但是大数据会TLE,于是参考别人的剪枝方法,那就是在递归添加元素的过程中,如果发现所剩的元素根本不够,即使全部用掉也凑不够k个,这样的循环就可以提前终止了。这个剪枝卡了我很久,不加这个就会超时。

class Solution(object):    def combine(self, n, k):        """        :type n: int        :type k: int        :rtype: List[List[int]]        """        ans = []        def dfs(subList,start,level):            if level == k:                ans.append(subList)                return            for i in xrange(start,n+1):                if n-i < k-level-1 :break                dfs(subList+[i],i+1,level+1)        dfs([],1,0)        return ans


0 0