18 带重复元素的子集
原题网址:https://www.lintcode.com/zh-cn/problem/subsets-ii/
给定一个可能具有重复数字的列表,返回其所有可能的子集
注意事项
- 子集中的每个元素都是非降序的
- 两个子集间的顺序是无关紧要的
- 解集中不能包含重复子集
样例
如果 S = [1,2,2]
,一个可能的答案为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
挑战
你可以同时用递归与非递归的方式解决么?
标签
方法1. 参考15、16题,可以非常鸡贼的设置一个判断数组是否已存在于二维数组result中的函数,然后还是子集的代码,只不过插入数组到result中前判断一下result中是否已存在该数组,嗯……
AC代码:
class Solution { public: /** * @param nums: A set of numbers. * @return: A list of lists. All valid subsets. */ vector<vector<int>> subsetsWithDup(vector<int> &nums) { // write your code here vector<vector<int>> result; if (nums.empty()) { result.push_back(nums); return result; } sort(nums.begin(),nums.end()); vector<int> first; first.push_back(nums[0]); result.push_back(first); for (int i=1;i<(int)nums.size();i++) { int size1=result.size(); for (int j=0;j<size1;j++) { vector<int> temp1= result[j]; temp1.push_back(nums[i]); if (!isExist(result,temp1)) { result.push_back(temp1); } } vector<int> temp2; temp2.push_back(nums[i]); if (!isExist(result,temp2)) { result.push_back(temp2); } } vector<int> nul; result.push_back(nul); return result; } bool isSameNum(vector<int> num1,vector<int> num2) { if (num1.size()!=num2.size()) { return false; } for (int i=0;i<(int)num1.size();i++) { if (num1[i]!=num2[i]) { return false; } } return true; } bool isExist(vector<vector<int>> result,vector<int> num) { if (result.empty()) { return false; } for (int i=0;i<(int)result.size();i++) { if (isSameNum(num,result[i])) { return true; } } return false; } };
其他方法:https://www.cnblogs.com/felixfang/p/3775712.html 可以多啃几遍