zoukankan      html  css  js  c++  java
  • 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]
    ]
    

    运用递归。 1234为例子

    for  i in 1234:

      1  +  234(的全排列)

      2  +  134(的全排列)

      3  +  124(的全排列)

      4   + 123 (的全排列)

    对应程序的17行

     1 class Solution(object):
     2     def __init__(self):
     3         self.res = []
     4 
     5     def permute(self, nums):
     6         """
     7         :type nums: List[int]
     8         :rtype: List[List[int]]
     9         """
    10         self.help(nums, 0, len(nums))
    11 
    12         return self.res
    13 
    14     def help(self, a, lo, hi):
    15         if(lo == hi):
    16             self.res.append(a[0:hi])
    17         for i in range(lo, hi):
    18             self.swap(a, i, lo)
    19             self.help(a, lo + 1, hi)
    20             self.swap(a, i, lo)
    21     def swap(self, a, i, j):
    22         temp = a[i]
    23         a[i] = a[j]
    24         a[j] = temp

    非递归

     1 class Solution(object):
     2  
     3 
     4     def permute(self, nums):
     5         """
     6         :type nums: List[int]
     7         :rtype: List[List[int]]
     8         """
     9         nums = sorted(nums.copy())
    10         res = [nums.copy()]
    11 
    12         n = self.next_permute(nums)
    13         while True:
    14             
    15             if n is None:
    16                 break
    17             res.append(n)
    18             n = self.next_permute(n.copy())
    19 
    20         return res
    21 
    22     def next_permute(self, a):
    23         i = -1
    24         for index in range(0, len(a) - 1)[::-1]:
    25             if(a[index] < a[index + 1]):
    26                 i = index
    27                 break
    28         if i==-1:
    29             return None       
    30         min_i = a.index(min([k for k in a[i+1:] if k >a[i]]))
    31         self.swap(a, i, min_i)
    32         an = a[:i + 1] + self.revers(a[i + 1:])
    33         return an
    34 
    35     def revers(self, x):
    36         for i in range(int(len(x) / 2)):
    37             temp = x[i]
    38             x[i] = x[len(x) - i - 1]
    39             x[len(x) - i - 1] = temp
    40         return x
    41 
    42     def swap(self, a, i, j):
    43         temp = a[i]
    44         a[i] = a[j]
    45         a[j] = temp
  • 相关阅读:
    《DSP using MATLAB》Problem 6.4
    《DSP using MATLAB》Problem 6.3
    《DSP using MATLAB》Problem 6.1
    《DSP using MATLAB》Problem 5.38
    整除分块+取模
    尺取法(滑窗,双指针)
    uva247电话圈(floyd)
    uva1151并查集+最小生成树
    uva1395 苗条的生成树
    uva10562看图写树
  • 原文地址:https://www.cnblogs.com/zle1992/p/8448766.html
Copyright © 2011-2022 走看看