思路分析:
-
成员变量:
result
: 用于存储最终的子集结果。path
: 用于存储当前正在构建的子集。
-
DFS函数:
dfs(vector<int>& nums, int start)
: 递归地生成子集。- 从给定的
start
索引开始遍历数组。 - 如果当前元素与前一个元素相同(处理重复元素),则跳过,以避免产生重复的子集。
- 将当前元素加入
path
中,然后将path
加入result
中。 - 递归调用DFS,更新
start
为下一个不同的元素的索引。 - 回溯:移除
path
的最后一个元素,以便探索其他可能性。
- 从给定的
-
主函数
subsetsWithDup
:- 对输入数组
nums
进行排序,以确保相同元素相邻。 - 初始化
result
为一个空集。 - 调用DFS开始生成子集,初始索引为0。
- 返回最终的子集结果
result
。
- 对输入数组
class Solution {
vector<vector<int>> result; // 存储最终的子集结果
vector<int> path; // 存储当前正在构建的子集
// 深度优先搜索(DFS)函数用于生成子集
void dfs(vector<int>& nums, int start) {
for (int i = start; i < nums.size(); i++) {
// 跳过重复元素,以避免产生重复的子集
if (i != start && nums[i] == nums[i - 1])
continue;
// 将当前元素加入子集
path.push_back(nums[i]);
// 将当前子集加入结果
result.push_back(path);
// 递归调用DFS,更新起始索引为下一个不同元素的位置
dfs(nums, i + 1);
// 回溯:移除最后一个元素,以便探索其他可能性
path.pop_back();
}
return;
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
// 对输入数组进行排序,以处理重复元素
sort(nums.begin(), nums.end());
// 初始化结果为一个空子集
result.push_back({});
// 调用DFS开始生成子集,初始索引为0
dfs(nums, 0);
// 返回最终的子集结果 result
return result;
}
};