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
来源:oschina
链接:https://my.oschina.net/u/4389765/blog/4236653