[LeetCode]Subsets

来源:互联网 发布:addictive drums2 mac 编辑:程序博客网 时间:2024/06/07 14:53

题目

Number: 78
Difficulty: Medium
Tags: Array, Backtracking, Bit Manipulation

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],  []]

题解

给出一个数组,求解数组的所有组合。

可以用三种方法求解,回溯递归,和位操作

详细说一下位操作:

比如数组大小为3,[1,2,3],那么所有的组合数为2^3共8种。

如果考虑3位二进制,000,001,010,011,100,101,110,111,每一位为1就代表相应的一种组合。因此:

000 ->  []001 ->  [1]010 ->  [2]011 ->  [1, 2]100 ->  [3]101 ->  [1, 3]110 ->  [2, 3]111 ->  [1, 2, 3]

代码

Backtracking

vector<vector<int>> subsets(vector<int>& nums) {    sort(nums.begin(), nums.end());    vector<vector<int>> res;    vector<int> sub;    getsub(res, sub, nums, 0);    return res;}void getsub(vector<vector<int>> &res, vector<int> &sub, vector<int> &nums, int start){    res.push_back(sub);    for(int i = start; i < nums.size(); i++){        sub.push_back(nums[i]);        getsub(res, sub, nums, i + 1);        sub.pop_back();    }}

Iterative

vector<vector<int>> subsets(vector<int>& nums) {    sort(nums.begin(), nums.end());    vector<vector<int>> res(1, vector<int>());    for(int i = 0; i < nums.size(); i++){        int n = res.size();        for(int j = 0; j < n; j++){            res.push_back(res[j]);            res.back().push_back(nums[i]);        }    }    return res;}

Bit Manipulation

vector<vector<int>> subsets(vector<int>& nums) {    sort(nums.begin(), nums.end());    int num_sub = pow(2, nums.size());    vector<vector<int>> res(num_sub, vector<int>());    for(int i = 0; i < nums.size(); i++){        for(int j = 0; j < num_sub; j ++){            if((j >> i) & 1)                res[j].push_back(nums[i]);        }    }    return res;}
0 0
原创粉丝点击