Leetcode: Subsets

本文转自:http://blog.csdn.net/tuantuanls/article/details/8751495


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],
  []
]
解法一:
当每个步骤有多种选择时,并且有终止条件就可以使用DFS。
求一个集合的全部子集,和全排列类似,第一反应就是DFS,一个二叉树,左边是当前元素不在集合中,右边是当前元素在集合中。
 1 class Solution {
 2     vector<vector<int> > result;
 3 public:
 4     void sub(vector<int> &S, vector<int> tmp, int level){
 5         if(level == S.size()){//终止条件,典型了DFS或者BFS
 6             result.push_back(tmp);
 7             return;
 8         }
 9         
10         sub(S, tmp, level + 1);//没有加入当前层元素
11         tmp.push_back(S[level]);
12         sub(S, tmp, level + 1);//加入了当前层元素
13         
14     }
15 
16     vector<vector<int> > subsets(vector<int> &S) {
17     // Start typing your C/C++ solution below
18     // DO NOT write int main() function
19         int N = S.size();
20     
21         sort(S.begin(), S.end());
22         result.clear();
23         
24         vector<int> tmp;
25         sub(S, tmp, 0);
26         
27         return result;
28        
29     }
30 
31 };

解法二:

转成二进制的问题:

但其实呢,这个题目可以完全不用DFS来做,iterative 的方法完全可以解决。

假定原集合中有N个元素,那么一共有2^N个子集,可以用一个整数 i 从 0 遍历到 2^N -1,转成二进制,i的每一位代表当前元素在不在结果中,0代表空集,11...1代表原集合。
 
 1 class Solution {
 2 public:
 3     vector<vector<int> > subsets(vector<int> &S) {
 4     // Start typing your C/C++ solution below
 5     // DO NOT write int main() function
 6         int N = S.size();
 7     
 8         sort(S.begin(), S.end());
 9     
10         vector<vector<int> > result;
11         vector<int> tmp;
12         bool exist;
13     
14         for(int i = 0; i < pow(2, N); i++){
15             tmp.clear();
16             for(int j = 0; j < N; j++){
17                 exist = (i >> j) & 1;
18                 if(exist){
19                     tmp.push_back(S[j]);
20                 }
21             }
22             result.push_back(tmp);
23         }
24     
25         return result;
26     }
27 
28 };

 解法三:

 1 vector<vector<int> > subsets(vector<int> &S) {
 2     sort(S.begin(), S.end());
 3     vector<vector<int> > v(1);
 4     for(int i = 0; i < S.size(); ++i) {
 5         int j = v.size();
 6         while(j-- > 0) {
 7             v.push_back(v[j]);
 8             v.back().push_back(S[i]);
 9         }
10     }
11     return v;
12 }

 



 

posted @ 2013-04-29 14:09  caijinlong  阅读(732)  评论(0编辑  收藏  举报