LeetCode算法题之46. Permutations(medium)【Python3题解】

本文深入解析了一道典型的排列组合算法题目,通过实例演示了如何利用递归和交换元素的方法,生成给定整数集合的所有可能排列。文章详细介绍了算法的实现思路,并提供了Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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. 此题如果人为来做,像例子那样,可以不重不漏的,轻松找出来所有的排列,但是用程序做,好像没那么容易
  2. 其实此题内部是有规律的,只要找出那个规律,作为突破口,那离解出来,就很近了
  3. 观察可以得知,有三个数,或者更多,焦点集中在后三个数上,第一次,后三个数的第一个数当头,有两种排列;下次,后三个数的第二个数当头,还有两种排列,最后一次,后三个数的最后一个数,当头,又有两种,也就是示例所示
  4. 谁当头的做法,可以在最外层的循环实现,其余交换操作,在添加数组之前操作
  5. 写在最后,以上所写,基本意义不大,要想弄明白,在纸上将下列程序中的变量如何变化,到底循环做了什么,每一步,写出来,下次遇到同样情况的问题,套用也是没问题的

少废话,上代码:

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值