本文主要是介绍(LeetCode 90)子集 II [添加约束条件,去重复],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
90. 子集 II
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
分析:
使用for(int i=0;i<(1<<n);i++),枚举全部子集。 i的所有位由0,1组成,根据i在某一位 j 上是否为 1,来判断当前元素是否包括nums[j]. 有问题请仔细阅读代码,其实很简单
对于上述枚举,添加约束条件,去重:
去重的思想和方法同: https://blog.csdn.net/STILLxjy/article/details/83046951
排序后,确保相同的数字严格按照序号的顺序进入,即 当nums[j-1] == nums[j]时,在加入nums[j]时,一定要确保nums[j-1]已经加入了。
AC代码:
class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {int n = nums.size();sort(nums.begin(),nums.end());vector<vector<int>> ans;for(int i=0;i<(1<<n);i++){vector<int> tmp;int t = i;int f = 1;for(int j=0;j<n;j++){if((1<<j) & i){if(j == 0) tmp.push_back(nums[j]);else if(nums[j-1] != nums[j]) tmp.push_back(nums[j]);else if( (1<<(j-1)) & i) tmp.push_back(nums[j]);else f = 0;}}if(f) ans.push_back(tmp);}return ans;}
};
这篇关于(LeetCode 90)子集 II [添加约束条件,去重复]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!