leetcode专题训练 77. Combinations

  1. 方法1
    这道题用递归的方法即可。我的想法是,k=n时的所有排列组合result,一定是由k=n-1时的排列组合tmp和一个新数组成。
class Solution:
    def solve(self, begin: int, end: int, k: int) -> List[List[int]]:
        if k == 1:
            return [[i] for i in range(begin, end+1)]
        result = []
        for num in range(begin, end+1):
            tmp = self.solve(num+1, end, k-1)
            for re in tmp:
                re.append(num)
                result.append(re)
        return result

    def combine(self, n: int, k: int) -> List[List[int]]:
        if k == 0 or n == 0:
            return []
            
        return self.solve(1, n, k)
  1. 方法2
    看了官方题解,觉得我写的方法一有些拧巴,我是倒着写的,可以正着写,可以写的再简略一些。这里有一个坑,在得到一个排列组合结果,append到output中的时候,需要用output.append(com[:]),而不是output.append(com),因为在python中,默认只有一个com变量,所有的修改都是修改这一个com变量,所以最后output中的值,都是同一个com变量的值,如果想要使得output的值是com变量在中间过程中的值,需要使用com[:],相当于重新定义了一个list。还有一个坑也是因为所有修改都修改一个com变量,在程序执行的时候,com是引用传递,所以后续的操作会影响回溯前的com的值,所以要com.pop()将新加的值弹出。
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        if k == 0 or n == 0:
            return []
        
        def solve(begin: int, cur: int, com: list):
            if cur == k:
                output.append(com[:])
                return
            for i in range(begin, n+1):
                com.append(i)
                solve(i+1, cur+1, com)
                com.pop()
            return 

        output = []
        solve(1, 0, [])
        return output

你可能感兴趣的:(leetcode专题训练 77. Combinations)