[LeetCode系列]子集枚举问题[无重复元素]

给定一组数(未排序), 求它们的所有组合可能.

如给定{1 2 3}, 返回:

[ [] [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3] ]

算法思路:

  1. 对数组排序, 从小到大;
  2. 令 i = 0, 对已有组合v从后往前进行如下操作
    1. v的最后1个组合内加入第i个元素;
    2. 将新组合加入到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 class Solution {
 2 public:
 3     vector<vector<int> > subsets(vector<int> &S) {
 4         sort(S.begin(), S.end());
 5         vector<vector<int> > v(1);
 6         for(int i = 0; i < S.size(); ++i) {
 7             int j = v.size();
 8             while(j-- > 0) {
 9                 v.push_back(v[j]);
10                 v.back().push_back(S[i]);
11             }
12         }
13         return v;
14     }
15 };
时间: 2024-11-10 10:31:30

[LeetCode系列]子集枚举问题[无重复元素]的相关文章

[LeetCode系列]子集枚举问题[有重复元素]

给定一组数(未排序, 可能有重复元素), 求出所有可能的组合. 算法和无重复元素的相似. 唯一需要注意的是, 如果当前的数字和之前的相同, 算法就只会在结尾数字是此数字的组合后加上此数字. 比如现在是[[] [1] [1 2] [2]], 当前数字是2, 就只会增加[1 2 2] [2 2] 代码: 1 class Solution { 2 public: 3 vector<vector<int> > subsetsWithDup(vector<int> &S)

求全排列(数组有重复元素和数组无重复元素) 回溯 递归

http://www.cnblogs.com/TenosDoIt/p/3662644.html 无重复元素 http://blog.csdn.net/havenoidea/article/details/12838479 有重复元素

leetcode力扣刷题系列python——3、无重复字符的最长子串

题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1. 解法: 采用哈希表法:设定左右双指针l和r,遍历字符串:哈希表存储某字符s[i]最新在字符串中出现的位置index + 1,key, value

【leetcode算法-中等】3. 无重复字符的最长字串

[题目描述] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3.示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1.示例 3: 输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke&qu

无重复元素的排列

/*========================================================== 设有n个整数的集合{1,2,3,......,n},从中任意选择r个数进行排列. 其中r<n,请列出所有排列. 思路:递归r层,每层选择一个数放到a[].当递归到r层时得到一组排列. 在每一层中做选择的时候,要把所有可能的选择都进行尝试. 具体看代码. ============================================================*/

46. Permutations(java,无重复元素,字典序 + 非字典序)

题目:Given a collection of distinct numbers, return all possible permutations. 解析:本题可以有两种方法解决 方法一:1)将第一个元素依次与所有元素进行交换: 2)交换后,可看作两部分:第一个元素及其后面的元素: 3)后面的元素又可以看作一个待排列的数组,递归,当剩余的部分只剩一个元素时,得到一个排列: 4)将第1步中交换的元素还原,再与下一个位元素交换. 重复以上4步骤,直到交换到最后一个元素.(参考剑指offer讲解)

LeetCode Single Number (找不不重复元素)

题意:给一个序列,序列中只有1个是单个的,其他都是成对出现的.也就是序列中有奇数个元素.要求找出这个元素. 思路:成对出现用异或最好了.两个同样的数一异或就变零,剩下的,就是那个落单的. 1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) { 4 int res=0; 5 for(int i=0; i<nums.size(); i++) 6 res^=nums[i]; 7 return res; 8

数据结构---无重复元素链表的实现

//节点结构体 struct inv { int i;//节点元素 struct inv*nextpointer; }; //返回指定元素节点的指针,不包含时返回NULL struct inv* contain(int i,struct inv*head) { struct inv *headp=head; while(headp!=NULL) { if(headp->i==i) { break; } headp=headp->nextpointer; } return headp; } //

[LeetCode系列]组合和枚举问题

给定一列数(未排序)和一个目标值, 找出所有可能的组合和等于目标值的组合, 数组中的数可以重复使用. 算法思路: 使用递归. 对数组排序, 从小到大; 令i = 起始下标(初始为0), 对于每一个数, 如果它等于目标值, 则在缓存结果中加入此数并将缓存结果加入输出队列, 随后在缓存结果中删除此数; 如果它小于目标值, 则在缓存结果中加入此数并递归调用此算法, 目标值更新为差值, 起始下标为i; 如果它大于目标值, 算法返回. 对于2.2的理解: 如果这个数小于目标值, 由于算法是循环递归, 那么