Leetcode|46. 全排列【笔记】

本文详细介绍了LeetCode上的46题全排列问题,通过四种不同的算法思路进行解答,包括动态规划、回溯法、调用库函数以及见缝插数的方法。每种思路都有清晰的代码实现,帮助读者理解全排列问题的解决过程。同时,文章还提供了相关知识和参考资料,以加深对递归和回溯等概念的理解。
摘要由CSDN通过智能技术生成

链接

https://leetcode-cn.com/problems/permutations/

前言

中等难度的果然难,理解起来都费劲

题目

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

关键

  • 递归的思想

思路1

  • 动态规划
class Solution:
    def permute(self, nums):
        dp={}
        dp[0] = [[]]
        for i in range(1,len(nums)+1):
            dp[i]=[]
            for j in dp[i-1]:
                for k in nums:
                    if k not in j:
                        tmp = j[:]
                        tmp.append(k)
                        dp[i].append(tmp[:])

        return dp[len(nums)]

思路2

  • 回溯法
  • 交换
class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def backtrack(first = 0):
            # 所有数都填完了
            if first == n:  
                res.append(nums[:])
            for i in range(first, n):
                # 动态维护数组
                nums[first], nums[i] = nums[i], nums[first]
                # 继续递归填下一个数
                backtrack(first + 1)
                # 撤销操作
                nums[first], nums[i] = nums[i], nums[first]
        
        n = len(nums)
        res = []
        backtrack()
        return res

思路3

  • 调库
  • list(itertools.permutations(nums))
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        return list(itertools.permutations(nums))

思路4

  • 见缝插数
  • 三层遍历
  • 第1层i:选nums中的元素nums[i]
  • 第2层k:选要被插数的子列表
  • 第3层j:选插数的位置
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = [[nums[0]]]
        n = len(nums)
        tmp = []
        for i in range(1, n):
            for k in res:
                for j in range(len(k)+1):
                    k.insert(j,nums[i])
                    tmp.append(k[:])
                    k.pop(j)
            res = tmp
            tmp = []
        return res

相关知识

疑问

参考

[1] 回溯算法入门级详解 + 练习(持续更新)
[2] 四种方法:DFS、BFS、动态规划和贪心枚举
[3] 全排列
[4] 超强gif助你理解使用“4种”方法求解本题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值