给定一个没有重复数字的序列,返回其所有可能的全排列---leetcode精选算法练习题

[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系列资讯类文章,欢迎您的关注!
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值