全排列
- 题目
- 题目描述
- 示例 1:
- 示例 2:
- 示例 3:
- 提示:
- 题解
- 解决方案:回溯算法
- 思路:
- Python 实现:
- 复杂度分析:
- 提交结果
题目
题目描述
给定一个不含重复数字的数组 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]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同
题解
给定一个不含重复数字的数组 nums
,要求返回其所有可能的全排列。这是一个经典的回溯算法问题。回溯算法是一种通过构建所有可能的解决方案并逐个检查是否满足条件来解决问题的方法。
解决方案:回溯算法
思路:
- 选择列表:初始时,选择列表为输入的数组
nums
。 - 路径:记录当前构建的排列。
- 结束条件:当路径的长度等于
nums
的长度时,说明找到了一个完整的排列。 - 递归:在每次递归调用中,尝试将每个未使用的数字添加到当前路径,并继续探索后续的选择。
- 撤销选择:当从递归调用返回时,需要撤销上一步的选择,以便尝试其他可能性。
Python 实现:
def permute(nums):
def backtrack(start=0):
# 结束条件:如果起始位置等于数组长度,则找到了一个排列
if start == len(nums):
result.append(nums[:])
return
for i in range(start, len(nums)):
# 交换当前元素与起始位置的元素
nums[start], nums[i] = nums[i], nums[start]
# 继续构建下一个位置的排列
backtrack(start + 1)
# 撤销选择
nums[start], nums[i] = nums[i], nums[start]
result = []
backtrack()
return result
复杂度分析:
- 时间复杂度:O(n!),其中 n 是数组
nums
的长度。因为生成所有排列的数量是 n!。 - 空间复杂度:O(n!),用于存储所有的排列结果。递归栈的空间复杂度是 O(n),但这不是主要因素,因为排列结果占用的空间远大于递归栈。
这个实现方法利用了回溯的思想,通过交换元素的位置来构建所有可能的排列,并且确保了不会产生重复的排列(因为题目保证了 nums
中没有重复数字)。这种方法简单直观,易于理解和实现。