【leetcode】subsets
2015-09-13 19:53
369 查看
题目:
Given a set of distinct integers, S, 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 S = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解答:
1.位操作
数组的子集中的数字只有两种状态 1. 存在 2. 不存在 分别用1/0来表示这两种状态,则每个子集都可以用n位的0/1的二进制数来表示
因此对于每个子集 只需要查看该子集的标号(0/1序列)各位中是否含有1,有1 表示该位的数字存在,否则 不存在,基于这个原理 可得下列的代码:
2.
如{1,2,3}的子集 包括0个数的组合,1个数的组合,2个数的组合和3个数的组合合并而成:
3. dfs(向后追溯)
Given a set of distinct integers, S, 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 S = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解答:
1.位操作
数组的子集中的数字只有两种状态 1. 存在 2. 不存在 分别用1/0来表示这两种状态,则每个子集都可以用n位的0/1的二进制数来表示
因此对于每个子集 只需要查看该子集的标号(0/1序列)各位中是否含有1,有1 表示该位的数字存在,否则 不存在,基于这个原理 可得下列的代码:
vector<vector<int> > subsets(vector<int> &S) { //首先对原数组进行排序 sort (S.begin(), S.end()); //数组的大小 即每个子集的二进制序列的长度 int elem_num = S.size(); //子集的数目 int subset_num = pow (2, elem_num); vector<vector<int> > subset_set (subset_num, vector<int>()); for (int i = 0; i < elem_num; i++) for (int j = 0; j < subset_num; j++) //判断每个子集的二进制序列的i位是否为1 为1 则存在该数(加入到子集数组中) if ((j >> i) & 1) subset_set[j].push_back (S[i]); return subset_set; }
2.
如{1,2,3}的子集 包括0个数的组合,1个数的组合,2个数的组合和3个数的组合合并而成:
vector<vector<int>> subsets(vector<int>& nums) { res.push_back(tmp); int n=nums.size(); if(!n) return res; sort(nums.begin(),nums.end()); for(int i=1;i<=n;i++){ helper(nums,i,0,n-1,0); } return res; } void helper(vector<int>& nums,int k,int start,int n,int num){ if(num==k){ res.push_back(tmp); return; } for(int i=start;i<=n;i++){ tmp.push_back(nums[i]); helper(nums,k,i+1,n,num+1); tmp.pop_back(); } }
3. dfs(向后追溯)
vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> subs; vector<int> sub; genSubsets(nums, 0, sub, subs); return subs; } void genSubsets(vector<int>& nums, int start, vector<int>& sub, vector<vector<int>>& subs) { subs.push_back(sub); for (int i = start; i < nums.size(); i++) { //原数组的子集可由 某个数+{去掉该数的集合的子集} 得到 sub.push_back(nums[i]); genSubsets(nums, i + 1, sub, subs); sub.pop_back(); } }
相关文章推荐
- java中使用sort()对ArrayList进行排序
- mysql出现Data truncated for column
- C学习之结构体
- 浙江大学PAT_乙级_1043. 输出PATest(20)
- 软件测试分类
- 经典算法之-----贪心算法
- unity3d简单的相机跟随及视野旋转缩放
- 学mysql必须了解的东西
- 集合之——LinkedHashSet
- 腾讯笔试题
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
- 数据挖掘
- Python爬虫
- map的详细用法
- Caused by: android.os.NetworkOnMainThreadException错误解决办法
- 复制文本文件
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- Minimum Path Sum
- java.rmi.ConnectException: Connection refused to host: 127.0.0.1
- Android 异常记录