zoukankan      html  css  js  c++  java
  • LeetCode 46. Permutations

    原题

    Given a collection of distinct numbers, return all possible permutations.

    For example,
    [1,2,3] have the following permutations:

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

    解题思路

    递归:递归的方法,创建一个visit判断此值是否已经添加过,每一层不断地循环,加入没有被访问的元素,直到最后结果的长度满足要求加入答案中

    class Solution(object):
        def permute(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            if nums == None:
                return []
            visit = [0 for i in range(len(nums))]
            self.ret = []
            self._permute(nums, visit, 0, [])
            return self.ret
            
        def _permute(self, nums, visit, count, ret):
            if count == len(nums):
                self.ret.append(ret)
                return
            for i in xrange(len(nums)):
                if visit[i] == 0:
                    # ret += [nums[i]]  容易出错,如果加入这句后面需要还原,不然影响后面的循环
                    visit[i] = 1
                    self._permute(nums, visit, count+1, ret+[nums[i]])
                    visit[i] = 0
    

    非递归:跟之前求subsets的思路类似(不过这个是求重复项,sbusets是求非重复),也是从一个个元素一层层加上去,只不过加入结果的时候必须满足长度要求

    class Solution(object):
        def permute(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            if nums is None:
                return []
            result = []
            self.helper(nums, [], result)
            return result
    
        def helper(self, List, path, result):
            if len(path) == len(List):
                result.append(path)
                return
            
            # 跟subsets思路差不多,不过这个是重复,sbusets是非重复
            # 也是从一个个元素一层层加上去,只不过加入结果的时候必须满足长度要求
            for i in range(len(List)):
                # 不重复加入同一元素
                if List[i] in path:
                    continue
                # path.append(List[i])
                self.helper(List, path + [List[i]], result)
                # path.pop()
    

      

  • 相关阅读:
    【Codevs 2630】宝库通道
    【Codevs 2115】数集分割
    【HDU2037】今年暑假不AC
    【Codeforces】Round #376 (Div. 2)
    【Dairy】2016.10.17-1 OIer最悲剧的事情
    【Codevs 3115】高精度练习之减法
    【Codevs1080】质数环
    【T^T 1871】获取敌情
    【Codevs3151】交通管制I
    【Codeforces】716D Complete The Graph
  • 原文地址:https://www.cnblogs.com/yechanglv/p/6935641.html
Copyright © 2011-2022 走看看