LeetCode----Combinations

来源:互联网 发布:上海大型网络工程公司 编辑:程序博客网 时间:2024/06/11 06:16

Combinations

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

[  [2,4],  [3,4],  [2,3],  [1,2],  [1,3],  [1,4],]


分析:

组合问题。适合使用回溯法解决,另外python下地itertools中也提供了combinations函数。


回溯法:

class Solution(object):    def combine(self, n, k):        """        :type n: int        :type k: int        :rtype: List[List[int]]        """        ans = []        self.dfs(n, k, 1, [], ans)        return ans    def dfs(self, n, k, start, lst, ans):        if not k:            ans.append(lst)            return        for i in range(start, n + 1):            self.dfs(n, k - 1, i + 1, lst + [i], ans)


itertools.combinations:

class Solution(object):    def combine(self, n, k):        """        :type n: int        :type k: int        :rtype: List[List[int]]        """        from itertools import combinations        return [list(c) for c in combinations(range(1, n+1), k)]

回溯法2:

class Solution(object):    def combine(self, n, k):        """        :type n: int        :type k: int        :rtype: List[List[int]]        """        ans = []        stack = []        x = 1        while True:            l = len(stack)            print stack, x, 2 + l            if l == k:                ans.append(stack[:])            if l == k or x > n - k + l + 1:                if not stack:                    return ans                x = stack.pop() + 1            else:                stack.append(x)                x += 1

回溯法2来自于LeetCode中的Discuss。

代码解释:Combinations is typical application for backtracking. Two conditions for back track: (1) the stack length is already k (2) the current value is too large for the rest slots to fit in since we are using ascending order to make sure the uniqueness of each combination.

我的翻译:Combinations是典型的适用回溯法的题型。该代码会在满足两种条件下回溯:(1)当栈的长度已经达到k了;(2)当前值太大,无法放入栈中(由于是升序添加元素,所以可以确保每次产生的解不重复)。

0 0
原创粉丝点击