1. 回溯算法解决子集Ⅱ问题的核心思路
回溯算法是解决组合问题的利器,尤其适合处理需要穷举所有可能情况的问题。子集Ⅱ问题(LeetCode 90题)在标准子集问题基础上增加了"数组可能包含重复元素"这一条件,使得我们需要在生成所有子集的同时避免重复。
1.1 问题重述与难点分析
给定一个可能包含重复元素的整数数组nums,返回所有可能的子集(幂集)。解集不能包含重复的子集。例如:
- 输入:[1,2,2]
- 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
关键难点在于:
- 如何高效生成所有子集
- 如何避免重复子集的产生(如[1,2]和[1,2']被认为是相同的)
- 如何在递归过程中正确标记元素使用状态
1.2 解决方案框架设计
解决这个问题的核心框架包含以下几个关键部分:
- 排序预处理:先对数组进行排序,使相同元素相邻,便于后续去重判断
- used数组标记:记录每个元素在当前递归路径中的使用状态
- 树层去重逻辑:当发现重复元素时,通过used数组判断是否需要跳过
- 标准回溯流程:选择→递归→撤销选择的三步走策略
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现与核心逻辑解析
2.1 完整代码实现
cpp复制class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex, vector<bool>& used) {
result.push_back(path);
for (int i = startIndex; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
continue;
}
path.push_back(nums[i]);
