[46] 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
事例我们都能看懂 就是我们小时候学过的全排列 对于三个数字四个数字我们可以手动的排出来 但是当数组的数字很大的时候怎么办那?这时候我们就要用算法来解决啦~
下面给出两种解决这种问题的python代码:
第一种思路:使用python的库函数
Python3 itertools 文档
这里面有对该方法的详细解释 就是写好的接口 直接调用就行 一行代码搞定
import itertools
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(itertools.permutations(nums))
是不是很简单~
第二种思路:使用回溯算法
回溯算法是一个非常非常重要的算法 记得在机器学习决策树里面也用的是这类算法 很相似
关于回溯算法 大家可以参考这篇文章 详细解释了回溯算法并且有详细的例子:小白带你学–回溯算法
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
def backtrack(nums, tmp):
#判断数组是否为空
if not nums:
res.append(tmp)
return
for i in range(len(nums)):
#去掉i进行回溯
backtrack(nums[:i] + nums[i+1:], tmp + [nums[i]])
backtrack(nums, [])
return res
针对这个代码 我们重点讲一下他的具体实现 这样我们可以更加的理解他的意思
假设我们输入的是数组[1,2] 输入应该是它的全排列 有2个对应的数组:
[
[1,2],[2,1]
]
假设我们输入的是[1,2]
进入方法backtrack(nums, []) 数组不为空 不return 循环数组,数组长度为2,
for i in range(len(nums)):循环两次
i=1时第一次循环 backtrack([2],[1]) 数组不为空 不return 循环数组 数组长度1 backtrack([],[1,2]) 此时的tmp是[1,2]的原因是循环的过程是之前的tmp+现在i值下对应的数组的值 此时数组为空 所以res.append(tmp) return 此时res–>[1,2]
同理 i=2时第一次循环
return 此时res–>[[1,2],[2,1]]
所以输出是
[
[1,2],[2,1]
]
当然输入是三位数的时候也是这样的步骤 但是稍微复杂一点 有兴趣大家自己推一下~~~
其实回溯算法关键在于:不合适就退回上一步
然后通过约束条件, 减少时间复杂度.
AIMI-CN AI学习交流群【1015286623】获取更多AI笔记和资料,扫码加群:
分享技术,乐享生活:欢迎关注我们的公众号计算机视觉这件小事,每周推送AI系列资讯类文章,欢迎您的关注!