zoukankan      html  css  js  c++  java
  • 全排列

    给定一个没有重复数字的序列,返回其所有可能的全排列。

    示例:

    输入: [1,2,3]
    输出:
    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]

    记录一下自己的思路总结,关于去重复的思路比较棒:

    全排序一:

    class Solution(object):   
        def permute(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            全排序
            """
            self.result = []
            self.permutation(nums,0)
    #         print(self.result)
    #         st = {tuple(i) for i in self.result}
    #         l = [list(i) for i in st]
            return self.result
            
        def permutation(self,nums,start):
            length = len(nums)
            if start == length-1:
    #             print(nums)
                n = nums[:]
                self.result.append(n)
    
            for i in range(start,length):
    
                nums = self.swap(nums,start,i)
                self.permutation(nums,start+1)
                nums = self.swap(nums,start,i)
                    
        def swap(self,l,start,end):
            l[start],l[end] = l[end],l[start]
            return l
    

      

    全排序二:

    有两种方式,更好的肯定是从底层就不交换大大节约时间,无脑的则是先全排列,后集合去重。

    class Solution(object):
        def permuteUnique(self, nums):
            """
            全排列2集合去重复
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            self.result = []
            self.permutation(nums,0)
    #         print(self.result)
            st = {tuple(i) for i in self.result}
            l = [list(i) for i in st]
            return l
            
        def permutation(self,nums,start):
            length = len(nums)
            if start == length-1:
    #             print(nums)
                n = nums[:]
                self.result.append(n)
    
            for i in range(start,length):
    
                nums = self.swap(nums,start,i)
                self.permutation(nums,start+1)
                nums = self.swap(nums,start,i)
                    
        def swap(self,l,start,end):
            l[start],l[end] = l[end],l[start]
            return l       
    

      

    class Solution(object):
        def permuteUnique(self, nums):
            """
            全排列2优化
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            self.result = []
            self.permutation(nums,0)
    #         print(self.result)
    
            return self.result
            
        def permutation(self,nums,start):
            length = len(nums)
            if start == length-1:
    #             print(nums)
                n = nums[:]
                self.result.append(n)
            temp = []
            for i in range(start,length):
                if nums[i] not in temp:
                    temp.append(nums[i])
                    nums = self.swap(nums,start,i)
                    self.permutation(nums,start+1)
                    nums = self.swap(nums,start,i)
                    
        def swap(self,l,start,end):
            l[start],l[end] = l[end],l[start]
            return l
    

      

  • 相关阅读:
    《架构师》反思:系统可靠性
    表现力(转)
    4月反思
    30天敏捷结果(10) 强化你的一周
    认真对待学习(2月反思)
    Sort By Double
    12月反思 组内设计评审会议
    WPF框架的内存泄漏BUG
    OpenExpressApp 框架结构(2)
    绑定子类的泛型基类,反模式?
  • 原文地址:https://www.cnblogs.com/zenan/p/9475479.html
Copyright © 2011-2022 走看看