当前位置: 代码迷 >> 综合 >> leetcode46 全排列算法
  详细解决方案

leetcode46 全排列算法

热度:13   发布时间:2023-12-15 19:43:22.0

插入法实现全排列算法,Python语言描述

思路:

  1. 给定一个待排列数组nums,如nums=[1,2,3]。定义一个保存结果的二维数组 result=[ [ ] ]
  2. 顺序的每次从nums中取一个元素num,从result弹出一个待插入列表(出队),将num插入进去。
  3. 如result弹出一个待插入列表是[ 1 ],num=2。这时有两种插入情况,分别是insert(0, num) 和 insert(1, num),插入的情况种类等于待插入列表的长度加1。
  4. 插入后我们将得到的新列表append到result里,这里result相当于一个队列,这里执行的是入队的动作
  5. 这里的重点是如何完整的把所有待插入列表全部出队,如待插入列表是result = [ [2,1], [3,2,1], [2,3,1], [2,1,3] ],这是由于上次弹出的[1,2]插入后形成三种结果入队造成的,下一步我们应该弹出[2,1]后结束本次出队循环

代码如下:

from copy import copy
class Solution(object):def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""result = [[nums[0]]]k1, k2 = 1, 1 # k2代表第n轮,k1代表n-1的阶乘,初始k2是第一轮,k1是0的阶乘i = 1while i <= k1 * k2:if k2 == len(nums):return resultpop_item = result.pop(0)for j in xrange(len(pop_item) + 1):tmp = copy(pop_item)tmp.insert(j, nums[k2])result.append(tmp)if i == k1 * k2: # i 在本次循环的最后一次,将i重新置为1i = 0k1 = k1 * k2k2 += 1i += 1

讲的可能不是很清楚,个人原创,建议在纸上手动写下过程就能懂了