您的位置:首页 > 其它

78. Subsets

2016-05-14 15:47 337 查看
题目:

Given a set of distinct integers, nums, 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 nums =
[1,2,3]
, a solution
is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

题意:

给定一个包含完全不相同元素的set集合nums,返回所有可能的子set集合。

note:

所有子set集合中的元素必须是递增顺序的;

给出的结果set集合不包含重复的子set集合;

思路一:

利用移位操作来分配给定数组元素,给定数组有m个元素,则其子集合的个数为2^m次方个子集合。左移0位并和1相&确定元素1在哪些子集合中,左移1位并和1相&确定元素2在哪些子集合中,左移2位并和1相&确定元素3在哪些子集合中.

代码:8ms

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        
        sort(nums.begin(), nums.end());
        int m = nums.size();
        int subm = pow(2, m);
        vector<vector<int>> result(subm, vector<int>());
        
        for(int i=0; i<m; i++){
           for(int j=0; j<subm; j++){
               if((j>>i) & 1){
                   result[j].push_back(nums[i]);
               }
           }
        }
        
        return result;
    }
};
思路二:

轮询;生成所有子集合的过程如下所示:

1、初始化:[[]]

2、添加第一个元素之后所有的子元素集合为:
[
[]
,
[1]
]
;
(在前面一个集合中添1构成新子集);

3、添加第二个元素之后所有的子元素集合为:
[
[],
[1]
,
[2],
[1, 2]]
;(在前面两个自己中分别添2构成新子集);

4、添加第三个元素之后所有的子元素集合为:
[
[],
[1], [2], [1, 2]
,
[3],
[1, 3], [2, 3], [1, 2, 3]]
。(在前面四个子集中分别添加3构成新的子集)


代码:8ms



class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        
        sort(nums.begin(), nums.end());
        vector<vector<int>> result(1, vector<int>());
        
        for(int i=0; i<nums.size(); i++){
            int n = result.size();
            for(int j=0; j<n; j++){
                result.push_back(result[j]);
                result.back().push_back(nums[i]);
            }
        }
        
        return result;
    }
};
思路三:

Recursive递归(Backtracking回溯)。

代码:8ms

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        
        sort(nums.begin(), nums.end());
        vector<vector<int>> results;
        vector<int> result;
        
        genSubsets(nums, 0, result, results);
        
        return results;
    }
    
    void genSubsets(vector<int>& nums, int start, vector<int>& result, vector<vector<int>>& results){
        results.push_back(result);
        for(int i=start; i<nums.size(); i++){
            result.push_back(nums[i]);
            genSubsets(nums, i+1, result, results);
            result.pop_back();
        }
    }
};

代码:4ms 时间复杂度最低

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        
        sort(nums.begin(), nums.end());
        vector<vector<int>> results;
        vector<int> result;
        
        genSubsets(nums, 0, result, results);
        
        return results;
    }
    
    void genSubsets(vector<int>& nums, int i, vector<int>& result, vector<vector<int>>& results){
        if(i==nums.size()){
            results.push_back(result);
            return;
        }
        
        result.push_back(nums[i]);
        genSubsets(nums, i+1, result, results);
        result.pop_back();
        genSubsets(nums, i+1, result, results);
        
        return;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: