LeetCode题解(python)
46. 全排列
题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题心得
本题——递归
递归总是那么难以理解,所以不如看递归过程中发生了什么
下面是测试代码和递归的输出
解题代码
class Solution:
def permute(self, nums):
ans = []
if len(nums) == 0:
return
if len(nums) == 1:
return [nums]
for index,item in enumerate(nums):
res = nums[:index]+nums[index+1:] #剩余的数字集合
print('res',res,'item',item)
for j in self.permute(res): #对剩余的数字进行递归
ans.append(j+[item])
print('ans',ans,'j',j)
return ans
if __name__ == '__main__':
nums = [1,2,3]
T = Solution()
print(T.permute(nums))
递归过程
res [2, 3] item 1
res [3] item 2
ans [[3, 2]] j [3]
res [2] item 3
ans [[3, 2], [2, 3]] j [2]
ans [[3, 2, 1]] j [3, 2]
ans [[3, 2, 1], [2, 3, 1]] j [2, 3]
res [1, 3] item 2
res [3] item 1
ans [[3, 1]] j [3]
res [1] item 3
ans [[3, 1], [1, 3]] j [1]
ans [[3, 2, 1], [2, 3, 1], [3, 1, 2]] j [3, 1]
ans [[3, 2, 1], [2, 3, 1], [3, 1, 2], [1, 3, 2]] j [1, 3]
res [1, 2] item 3
res [2] item 1
ans [[2, 1]] j [2]
res [1] item 2
ans [[2, 1], [1, 2]] j [1]
ans [[3, 2, 1], [2, 3, 1], [3, 1, 2], [1, 3, 2], [2, 1, 3]] j [2, 1]
ans [[3, 2, 1], [2, 3, 1], [3, 1, 2], [1, 3, 2], [2, 1, 3], [1, 2, 3]] j [1, 2]
[[3, 2, 1], [2, 3, 1], [3, 1, 2], [1, 3, 2], [2, 1, 3], [1, 2, 3]]