leetcode47全排列2
题目
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
解题思路
1. 基本回溯法
- 使用交换的方式生成排列
- 每次固定一个位置,然后递归处理剩余位置
- 但这种方法会产生重复的排列
2. 回溯法+剪枝
- 在基本回溯的基础上添加剪枝条件
- 通过判断是否已经使用过相同的数字来避免重复
- 需要先对数组排序,使相同的数字相邻
代码实现
1. 基本回溯法
1 | class Solution: |
2. 回溯法+剪枝
1 | class Solution: |
原理解析
1. 基本思路
- 通过交换元素的方式生成所有可能的排列
- 使用回溯法,在每一步都尝试所有可能的选择
- 递归到底时将当前排列加入结果集
2. 去重机制
- 在每一层递归中使用 set 记录已经使用过的数字
- 对于重复的数字,只在第一次遇到时使用
- 这样可以避免生成重复的排列
3. 复杂度分析
- 时间复杂度:O(n×n!),其中 n 是数组长度
- 空间复杂度:O(n),递归调用栈的深度
4. 关键点
- 使用
nums[:]
创建当前排列的副本 - 使用 set 进行剪枝,避免重复
- 注意交换和回溯的配对使用
- 递归终止条件的判断
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Never Settle!
评论