78. Subsets - cocoder39/coco39_LC GitHub Wiki
2020 Notes:
[1, 2, 3]
[] -> 1 -> 1,2 -> 1,2,3
-> 1,3
-> 2 -> 2,3
-> 3
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
self.helper(nums, 0, [], res)
return res
def helper(self, nums, cur_idx, path, res):
res.append(path[:])
for i in range(cur_idx, len(nums)):
path.append(nums[i])
self.helper(nums, i+1, path, res)
path.pop()
- Time complexity:
There are 2^N solutions since each number can be absent or present in a result. Each invocation of
helper()
adds one result to result list so there are 2^N invocations ofhelper()
. Eachhelper()
copies one result to result list so the total complexity is O(N * 2^N) - Space complexity: O(N * 2^N) to store all results and O(N) to store recursion stack so O(N * 2^N) intatal
Compared with solution below, this approach can be easily extended to support SubsetsII
==================================================================================================
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur;
helper(res, cur, nums, 0);
return res;
}
private:
void helper(vector<vector<int>>& res, vector<int>& cur, vector<int>& nums, int start) {
if (start == nums.size()) {
res.push_back(cur);
return;
}
helper(res, cur, nums, start + 1);
cur.push_back(nums[start]);
helper(res, cur, nums, start + 1);
cur.pop_back();
}
};