力扣-全排列

题目

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

**输入:**nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

**输入:**nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

**输入:**nums = [1]
输出:[[1]]

思路

DFS版子题五分钟秒了,本质上是DFS状态转移+状态回溯+终止条件处理,对于这道题来说要考虑到每一次选一个数,需要有一个表来记录已经选过的数,每次选没选过的,并且DFS之后把状态回溯,选择重置为空,注意这里要用到List.copy,不然只是存了引用,并没有产生新的List就会出现问题,并且List.copy也只是浅拷贝这里要注意一下要在合适的时候进行copy。

代码

class Solution:

    def permute(self, nums: List[int]) -> List[List[int]]:

        lenNums = len(nums)

        numsTab = {}

        for v in nums:

            numsTab[v] = -1

        ans = []

        def DFS(cur):

            if(len(cur) == lenNums):

                ans.append(cur)

                return

            for i in range(0,lenNums):

                if(numsTab[nums[i]] == -1):

                    numsTab[nums[i]] = 1

                    tempList = cur.copy()

                    tempList.append(nums[i])

                    DFS(tempList)

                    numsTab[nums[i]] = -1

        DFS([])

        return ans

猜你喜欢

转载自blog.csdn.net/TongOuO/article/details/132288718
今日推荐