题目描述:
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[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 = []
#定义一个按照题目要求,寻找规律的函数
def find(nums=nums, idx=0):
if idx == len(nums)-1:#设置停止条件,当idx到最后一个元素时,将数组加到ans中
ans.append(nums)
else:
for i in range(idx, len(nums)):
nums[i], nums[idx] = nums[idx], nums[i]#做交换数值的,也就是换顺序
find(nums[:], idx+1)#再次调用,同样规律
find()
return ans
运行时间和内存使用:
- Runtime: 40 ms, faster than 58.97% of Python3 online submissions for Permutations.
- Memory Usage: 14 MB, less than 5.36% of Python3 online submissions for Permutations.