leetcode90子集2
题目
给你一个整数数组 nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。
解题思路
1. 回溯
1 | class Solution: |
原理
1. 排序的作用
- 将数组排序,使相同元素相邻
- 便于后续去重处理
- 例如:
[4,1,4,4,4]
→[1,4,4,4,4]
2. 回溯过程
- 每个元素都有”选”和”不选”两种状态
- 通过
start
参数控制选择的起始位置 - 使用
path
记录当前路径
3. 去重机制
- 对于重复元素,只在第一次遇到时使用
i > start and nums[i] == nums[i-1]
跳过同层重复元素- 例如:对于
[1,2,2]
1
2
3
4第一层:[] 可以选择 1,2,2
选择1后:[1] 可以选择 2,2
选择第一个2后:[1,2] 可以选择最后一个2
第一层选择第二个2时跳过,因为和前一个2重复
4. 复杂度分析
- 时间复杂度:O(n×2^n),n是数组长度
- 空间复杂度:O(n),递归栈的深度
5. 关键点
- 必须先排序,这是去重的基础
- 使用
path[:]
创建路径副本 - 去重条件
i > start
不能省略 - 递归时使用
i+1
而不是start+1
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Never Settle!
评论