46. 全排列

在这里插入图片描述
思路
res:存放所有排序
track表示一种排列
如:nums = [1,2,3] 其中一种排列:[1,3,2]
进行回溯
在进行回溯时因为传的是nums,所以要排除重复 如当前track[1] 则在遍历nums时,遇到1就可以跳过,不然就会有[1,1]情况 这显然不符合要求
len(track)==len(nums)时,代表找到一种排列,这时候track进行回退,去寻找下一个(拿组合来举例 如 nums=[1,2,3,4] 找出长度为3的组合 这时候找到一个组合 123 下一个 124 那就是之前的123 去掉3 把4加进来 )
如本题 123是一种 此时track回退 然后找下一个 132 这两个1是一样的 则pop两次后继续找到下一种排列

将track加入res时,需注意用res.append(track[:]),而不是res.append(track) 否则在执行track操作时,加入到res的对应数据也会跟着发生变动

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res=[]
        #存放一种结果
        track=[]
        def backtrack(nums,track):
            if len(track)==len(nums):
                '''
                列表后面用[:]表示重新分配了内存给新的列表变量,这时两者的内存地址是不同的,
                因此,改变其中的一个变量a 是不会影响到另一个变量b的
                '''
                res.append(track[:])
                return 
            for i in nums:
                if i in track:
                    continue
                track.append(i)
                backtrack(nums,track)
                track.pop()
        backtrack(nums,track)
        return res

ps:
list[:]作用: https://blog.csdn.net/qq_42350785/article/details/123317262
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值