Skip to main content

Subsets

Subsets

Given an integer array nums of unique elements, return all possible subsets (the power set).

The solution set must not contain duplicate subsets. Return the solution in any order.

Example 1:

Input: nums = [1,2,3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

Example 2:

Input: nums = [0]
Output: [[],[0]]
    std::vector<std::vector<int>> subsets(std::vector<int>& nums) {

//idea-no sorting necessary, just initialize size
//then use bitshifting: i >> j & 1 . we are going vertical
//res[i].push_back(j)
//0 to p, 0 to n where p is 2^n

long long iters = std::pow(2, nums.size());
std::vector<std::vector<int>> res(iters);
for(int i = 0; i < iters; ++i) {
for(int j = 0; j < nums.size(); ++j) {
if((i >> j) & 1) {
res[i].push_back(nums[j]);
}
}
}

return res;
}

Note you can also do the backtracking way, which works for both with duplicates and without duplicates (Subsets II)

Subsets I

class Solution {
public:
std::vector<std::vector<int> > subsets(std::vector<int> &nums) {
std::sort(nums.begin(), nums.end());
std::vector<std::vector<int> > res;
std::vector<int> vec;
subsets(res, nums, vec, 0);
return res;
}
private:
void subsets(std::vector<std::vector<int> > &res, std::vector<int> &nums, std::vector<int> &vec, int begin) {
res.push_back(vec);
for (int i = begin; i != nums.size(); ++i) {
vec.push_back(nums[i]);
subsets(res, nums, vec, i + 1);
vec.pop_back();
}
}
};

Subsets II

class Solution {
public:
std::vector<std::vector<int> > subsetsWithDup(std::vector<int> &nums) {
std::sort(nums.begin(), nums.end());
std::vector<std::vector<int> > res;
std::vector<int> vec;
subsetsWithDup(res, nums, vec, 0);
return res;
}
private:
void subsetsWithDup(std::vector<std::vector<int> > &res, std::vector<int> &nums, std::vector<int> &vec, int begin) {
res.push_back(vec);
for (int i = begin; i != nums.size(); ++i)
if (i == begin || nums[i] != nums[i - 1]) {
vec.push_back(nums[i]);
subsetsWithDup(res, nums, vec, i + 1);
vec.pop_back();
}
}
};

Go

func subsets(nums []int) [][]int {
res := make([][]int, 0)
solve(nums, nil, &res)
return res
}

func solve(nums []int, cur []int, res *[][]int) {
*res = append(*res, append([]int{}, cur...))
for i := 0; i < len(nums); i++ {
solve(nums[i+1:], append(cur, nums[i]), res)
}
}

Subsets II

func subsetsWithDup(nums []int) [][]int {
res := [][]int{[]int{}}
var cur []int

sort.Ints(nums)
doSubsetsWithDup(nums, cur, &res)
return res
}

func doSubsetsWithDup(nums []int, cur []int, res *[][]int) {
for i := 0; i < len(nums); i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
cur = append(cur, nums[i])
newRes := make([]int, len(cur))
copy(newRes, cur)
*res = append(*res, newRes)

doSubsetsWithDup(nums[i+1:], cur, res)
cur = cur[:len(cur)-1]
}
}