LintCode 18 带重复元素的子集
2017-02-18 20:53
183 查看
题目:subsetsWithDup
要求:
给定一个可能具有重复数字的列表,返回其所有可能的子集 注意事项 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集
样例:
如果 S = [1,2,2],一个可能的答案为: [ [], [1], [1,2], [1,2,2], [2], [2,2] ]
算法要求:
你可以同时用递归与非递归的方式解决么?
解题思路:
在17题的基础上改。
算法如下:
bool isSame(vector<int> &v1, vector<int> &v2) { if (v1.size() != v2.size()) { return false; } sort(v1.begin(), v1.end()); sort(v2.begin(), v2.end()); if (v1 == v2) { return true; } else { return false; } } vector<vector<int> > subsetsWithDup(const vector<int> &S) { // write your code here vector<vector<int> > vecs; bool has = false; int n = 1 << S.size(); int j = 0; int k = 0; for (int i = 0; i < n; i++) { j = i; k = 0; has = false; vector<int> vec; while (j) { if (j & 1) { // 这句话相当于j % 2 == 1 vec.push_back(S[k]); } j >>= 1; // 这句话相当于j /= 2; k++; } for (j = 0; j < vecs.size(); j++) { if (isSame(vecs[j], vec)) { has = true; break; } } if (!has) { vecs.push_back(vec); } } return vecs; }
相关文章推荐
- lintcode-18-带重复元素的子集
- LintCode 18. 带重复元素的子集
- LintCode 18-带重复元素的子集 JAVA
- lintcode-带重复元素的子集-18
- (lintcode)第18题 带重复元素的子集
- lintcode---子集(带重复元素和不带重复元素的两种解法)
- LintCode笔记(11)—— 带重复元素的子集
- lintcode 中等题:subsets II 带重复元素的子集
- 18 - 带重复元素的子集
- LintCode 删除排序链表中的重复元素
- 删除排序链表中的重复元素-LintCode
- LintCode-----17.带重复元素的子集
- 18 如何从一个数组中移除重复的元素
- 二进制法枚举无重复元素子集
- LintCode 带重复元素的子序列
- 带重复元素的子集
- 带重复元素的子集
- lintcode 容易题:Remove Duplicates from Sorted List 删除排序链表中的重复元素
- 面试题: 已知一个含有n个不同元素的集合,要求打印其所有具有k个元素的子集(不允许有重复的)
- 112. 删除排序链表中的重复元素(remove-duplicates-from-sorted-list)(c++)----lintcode面试题之链表