LeetCode90——SubsetII
LeetCode78——Subsets的升级版本,主要考虑去重,这里也套用了之前的代码。
原题
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:[
[ 2 ],
[ 1 ],
[ 1,2,2 ],
[ 2,2 ],
[ 1,2 ],
[]
]
代码
这题需要考虑的问题就是去重了,我想了两种办法都比较low,网上看了一种比较好的办法。
sort+unique+erase
即按照原来的办法,假设产生一个带重复元素的集合vector<vector<int>>result
,我们对result
进行去重操作:
vector<vector<int>>result;
//...
sort(result.begin(),result.end());
result.erase(unique(result.begin(),result.end()),result.end());
这种方法比较简单,当然效率很低,刚好能够通过。
find插入前查找
把vector<int> temp
插入到vector<vector<int>> result
中之前查看result
中是否有temp
元素:
if (temp.size() == k&&(find(result.cbegin(),result.cend(),temp)==result.cend()))//k个数
{
result.push_back(temp);
return;
}
这种方法也比较简单,但是效率很低,和前一个差不多。
重复元素跳过
我们往vector<int> temp
添加元素时,如果
nums[index]==nums[index]
则跳过:
if(index!=i&&nums[index]==nums[index-1])
{
continue;
}
时间上这种方法最好。
完整代码
class Solution {
private:
void help(int i, int n, int k, vector<int>temp, vector<vector<int>>&result, vector<int>nums)
{
// if (temp.size() == k&&(find(result.cbegin(),result.cend(),temp)==result.cend()))//去重方法2
if (temp.size() == k)//k个数
{
result.push_back(temp);
return;
}
for (int index = i; index < n; index++)//i
{
if(index!=i&&nums[index]==nums[index-1])
{
continue;
}//去重方法3,效率较好
temp.push_back(nums[index]);
help(index + 1, n, k, temp, result, nums);
temp.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>>result;
vector<int>temp;
sort(nums.begin(), nums.end());
result.push_back(temp);
for (int i = 1; i <= nums.size(); i++)
{
help(0, nums.size(), i, temp, result, nums);
}
// 去重方法1
// sort(result.begin(),result.end());
// result.erase(unique(result.begin(),result.end()),result.end());
return result;
}
};