[LeetCode系列]子集枚举问题[无重复元素]
2014-08-29 11:22
127 查看
给定一组数(未排序), 求它们的所有组合可能.
如给定{1 2 3}, 返回:
[ [] [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3] ]
算法思路:
对数组排序, 从小到大;
令 i = 0, 对已有组合v从后往前进行如下操作
v的最后1个组合内加入第i个元素;
将新组合加入到v中
算法的理解可以通过一个例子来看:
给定S = {1 2 3},
v = [[]]
i = 0, j = 1, v = [[] [1]] // back().push_back(S[0])
i = 1, j = 2, v = [[] [1] | [1 2] [2]] // j = 2, add 2 new elems
i = 2, j = 4, v = [[] [1] [1 2] [2] | [2 3] [1 2 3] [1 3] [3]]
相同颜色前者为原有元素, 后者为增加后的元素.
代码:
如给定{1 2 3}, 返回:
[ [] [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3] ]
算法思路:
对数组排序, 从小到大;
令 i = 0, 对已有组合v从后往前进行如下操作
v的最后1个组合内加入第i个元素;
将新组合加入到v中
算法的理解可以通过一个例子来看:
给定S = {1 2 3},
v = [[]]
i = 0, j = 1, v = [[] [1]] // back().push_back(S[0])
i = 1, j = 2, v = [[] [1] | [1 2] [2]] // j = 2, add 2 new elems
i = 2, j = 4, v = [[] [1] [1 2] [2] | [2 3] [1 2 3] [1 3] [3]]
相同颜色前者为原有元素, 后者为增加后的元素.
代码:
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { sort(S.begin(), S.end()); vector<vector<int> > v(1); for(int i = 0; i < S.size(); ++i) { int j = v.size(); while(j-- > 0) { v.push_back(v[j]); v.back().push_back(S[i]); } } return v; } };
相关文章推荐
- [LeetCode系列]子集枚举问题[有重复元素]
- Subsets II [leetcode] 从获取子集的递归和循环方法说起,解决重复子集的问题
- LeetCode(一)之java集合重复元素问题
- Subsets 子集系列问题 leetcode
- 二进制法枚举无重复元素子集
- 【LeetCode】Subsets_II 带重复元素的子集 - Medium
- leetcode 47. Permutations II 全排列问题(去掉重复元素)+递归
- 子集系列(一) 传统subset 问题,例 [LeetCode] Subset, Subset II, Bloomberg 的一道面试题
- [LeetCode系列]组合和枚举问题
- 一个关于去除数组重复元素的问题(C语言实现)
- Leetcode 删除重复的链表元素
- Leetcode 最小二叉树深度和删除数组重复元素
- 练手系列(1) 找出数组中重复次数最多的元素并打印
- 有重复元素的排列问题
- [置顶] 关于jquery某一元素重复绑定的问题
- Remove Duplicates from Sorted Array II 从有序数组里移除重复出现元素,最多重复出现2次 @LeetCode
- leetcode: 2Sum/3Sum/3SumClosest/4Sum系列问题
- 8594 有重复元素的排列问题
- 有重复元素的排列问题
- 使用Commons-fileupload 组件上传时,获取表单其它元素系列问题集锦