剑指 Offer II 083. 没有重复元素集合的全排列

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 083. 没有重复元素集合的全排列相关的知识,希望对你有一定的参考价值。

剑指 Offer II 083. 没有重复元素集合的全排列

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

示例 1:

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

回溯算法

那么我们当时是怎么穷举全排列的呢?比方说给三个数 [1,2,3],你肯定不会无规律地乱穷举,一般是这样:

  • 先固定第一位为 1,然后第二位可以是 2,那么第三位只能是 3;然后可以把第二位变成 3,第三位就只能是 2 了;然后就只能变化第一位,变成 2,然后再穷举后两位……
  • 算法过程如图:

只要从根遍历这棵树,记录路径上的数字,其实就是所有的全排列。我们不妨把这棵树称为回溯算法的「决策树」。

我们定义的 backtrack 函数其实就像一个指针,在这棵树上游走,同时要正确维护每个节点的属性,每当走到树的底层,其「路径」就是一个全排列。

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = []
        path = []
        n = len(nums)
        used = [False] * n
        def backtrack(index = 0):
            if index == n:# 所有数都填完了
                res.append(path[:])
                return
            for i in range(0, n):
                if used[i]:
                    continue
                path.append(nums[i])
                used[i] = True
                backtrack(index+1)
                path.pop()
                used[i] = False
        backtrack(0)
        return res
class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        def backtrack(index = 0):
            # 所有数都填完了
            if index == n:  
                res.append(nums[:])
            for i in range(index, n):
                # 动态维护数组
                nums[index], nums[i] = nums[i], nums[index]
                # 继续递归填下一个数
                backtrack(index + 1)
                # 撤销操作
                nums[index], nums[i] = nums[i], nums[index]
        
        n = len(nums)
        res = []
        backtrack()
        return res

以上是关于剑指 Offer II 083. 没有重复元素集合的全排列的主要内容,如果未能解决你的问题,请参考以下文章

算法剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列(java / c / c++ / python / go / rust)

剑指 Offer II 082. 含有重复元素集合的组合

Leetcode刷题Python剑指 Offer II 082. 含有重复元素集合的组合

算法leetcode剑指 Offer II 081. 允许重复选择元素的组合(多语言实现)

算法leetcode剑指 Offer II 081. 允许重复选择元素的组合(多语言实现)

剑指 Offer II 016. 不含重复字符的最长子字符串