思路分析:
-
成员变量:
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开始生成子集,初始索引为0dfs(nums, 0);// 返回最终的子集结果 resultreturn result;}
};