再谈全排列

题目链接: . - 力扣(LeetCode)

每次做全排列的题目,我都要孕育好一阵子,到底怎么去思考这个问题呢?

首先,我觉得最好的方式就是画个树。

画了树之后,你就知道,这个问题,是一个循环遍历的问题,但是再遍历的过程中,你需要基于过去的状态(哪些元素被存储了),改变你之后的行为。

此外。我们还需要考虑终止条件,然后,这是一个回溯的问题,那么你需要考虑的就是回溯之后需要怎样的处理。

我们来一一回答这些问题

1. 如果保存过去的状态

我们可以通过一个mask,来记录哪些元素被传入了。

2. 如何设定终止条件

我们可以判断list的长度,如果list的长度和原数组一致,我们就可以保存。

3. backtrack之后的状态重置

我们需要重置两个状态,一个是path中的元素,另一个是遍历到的元素的判断。

class Solution(object):



    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        path = []
        result = []
        
        def backtrack(nums, used):
            if(len(path) == len(nums)):
                result.append(path[:])
                return
            for i,ele in enumerate(nums):
                if(used[i] == False):
                    path.append(ele)
                    used[i] = True            
                    backtrack(nums,used)
                    path.pop()
                    used[i] = False
            return result 

        used = [False] * len(nums)
        result = backtrack(nums, used)
        return result
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值