剑指 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)
Leetcode刷题Python剑指 Offer II 082. 含有重复元素集合的组合
算法leetcode剑指 Offer II 081. 允许重复选择元素的组合(多语言实现)