leetcode 46. Permutations 迭代+递归 python3

本文深入探讨了LeetCode上的一道经典算法题——全排列问题。提供了两种解题思路,一种是递归实现,另一种是迭代实现。详细解释了每种方法的原理,并给出了Python代码示例。同时,分析了不同实现方式的时间和空间复杂度。

一.问题描述

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]
]

二.解题思路

主要是有两种思路:

1,数组长度为n,后面i~n的子数组已完成全排列,我们慢慢向前推进,接下来把nums[i-1]加进去,来完成新子数组的全排列,方法就是把nums[i-1]插入i~n子数组所有全排列的结果中的每个可能位置,这种思路适合用递归实现,但是如果实现得不好会有很多多余计算,会在第三部分讨论。

2,数组长度为n,前面0~n的子数组已完成全排列,我们慢慢向后推进,接下来把nums[i+1]加进去,来完成新子数组的全排列,方法就是把nums[i+1]插入0~n子数组所有全排列的结果中的每个可能位置,这种思路适合用迭代实现。

时间复杂度:O(N*N*N), 空间复杂度:(N!*N)

更多leetcode算法题解法: 专栏 leetcode算法从零到结束  或者 leetcode 解题目录 Python3 一步一步持续更新~

三.源码

1.迭代

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        n=len(nums)
        if n==0 or n==1:return [nums]
        rst=[[nums[0]]]
        for i in range(1,n):
            rst=[rst[t][:k]+[nums[i]]+rst[t][k:] for t in range(len(rst)) for k in range(len(rst[t])+1)]
        return rst

2.递归

递归代码实现来自:https://leetcode.com/problems/permutations/discuss/550921/Easy-Python3-Code-96-faster-98-less-memory.

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        if not nums:
            return []
        if len(nums) == 1:
            return [nums]
        if len(nums) == 2:
            return [nums, nums[::-1]]
        result = [[x] + y for i, x in enumerate(nums) for y in self.permute(nums[:i] + nums[i+1:])]
'''
上面result这步包含了许多重复计算
这份代码的实现思路是,
对于一个nums数组,迭代将nums中的每个元素放在最前面,
然后和剩下的所有元素的全排列拼接,
方法是很直观,但是这份实现没有利用到任何之前已经完成的迭代的信息,
比如过对于一个数组[1,2,3,4,5,6],
我首先把1放在开头,然后求出[2,3,4,5,6]的全排列,拼接,
之后,我把2放在开头,求[1,3,4,5,6]的全排列,
然而,其实[3,4,5,6]的全排列在第一次求1开头的时候就已经求出来了,
但是这份实现完全没有利用到这个信息,
改善的话可以用变量存储已经求得的结果,用空间换时间
'''
        return result

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值