网站建设团队分工,贵安新区网站建设推广,有服务器还需要买网站空间吗,WordPress评论回复提醒勾选与本题相关联的题目解析#xff1a; leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目
给定一个可能包含重复元素的整数数组 nums#xff0c;返回该数组所有可能的子集#xff08;幂集#xff09;。 说明#xff1a;解集不能包含重复的子集。
思考
… 与本题相关联的题目解析 leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目
给定一个可能包含重复元素的整数数组 nums返回该数组所有可能的子集幂集。 说明解集不能包含重复的子集。
思考
在文章 leetcode 40. 组合总和 II思考分析 我们讲过去重的方法分为树层去重和树枝去重。 首先根据例子画出解空间树草图观察 发现同一层重复取2就要过滤掉同个树枝上是可以重复取相同元素的。这样就确定了去重条件在层遍历的for循环中加入
//如果遇到同一个集合的重复元素跳过这个元素即可
if(i startindex candidates[i] candidates[i-1]) continue;在调用函数前要先对数组进行排序使得重复的元素靠在一起加速剪枝。
//排序加速剪枝
sort(candidates.begin(),candidates.end());其余的思路和之前的leetcode 78. 子集 思考分析一样。
代码
class Solution {
public:vectorvectorint result;vectorint res;int floor0;void backtracking(vectorint nums,int start,int end){result.push_back(res);//剩余集合为空返回if(startend){return;}for(int istart;iend;i){if(i start nums[i] nums[i-1]) continue;//coutnums[i]层数floorendl;//处理结点res.push_back(nums[i]);floor;//递归,探索下一层backtracking(nums,i1,end); //递归floor--;//回溯撤销处理结果res.pop_back();}return;}vectorvectorint subsetsWithDup(vectorint nums) {result.clear();res.clear();floor0;//排序加速剪枝sort(nums.begin(),nums.end());backtracking(nums,0,nums.size());return result; }
};