插入法实现全排列算法,Python语言描述
思路:
- 给定一个待排列数组nums,如nums=[1,2,3]。定义一个保存结果的二维数组 result=[ [ ] ]
- 顺序的每次从nums中取一个元素num,从result弹出一个待插入列表(出队),将num插入进去。
- 如result弹出一个待插入列表是[ 1 ],num=2。这时有两种插入情况,分别是insert(0, num) 和 insert(1, num),插入的情况种类等于待插入列表的长度加1。
- 插入后我们将得到的新列表append到result里,这里result相当于一个队列,这里执行的是入队的动作
- 这里的重点是如何完整的把所有待插入列表全部出队,如待插入列表是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
讲的可能不是很清楚,个人原创,建议在纸上手动写下过程就能懂了