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
原文地址:https://www.cnblogs.com/zle1992/p/8448766.html