題目網址:https://leetcode.cn/problems/subsets/

題意:給一 array nums, 當中的元素互不相同, 返回所有可能的 subset。

Solution:

想法:利用 DFS + Backtracking, 每個元素都有取 or 不取兩種選擇

class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
dfs(nums, 0, nums.size());
return res;
}

private:
vector<int> cur;
vector<vector<int>> res;

void dfs(vector<int>& nums, int i, int n){
if (i == n) {
res.emplace_back(cur);
return;
}

dfs(nums, i + 1, n); // 不取

// 取
cur.emplace_back(nums[i]);
dfs(nums, i + 1, n);
cur.pop_back();
}
};
  • time:$O(n \cdot 2^n)$
    • 有 $2^n$ 種 subset
    • 建每一種 subset 需 $O(n)$ time, 因為 i[0, n]
  • space:$O(n)$ ➔ 若不考慮要返回的 array, 則只需 $O(n)$
    • $O(n)$:dfs() 遞迴最大深度、cur 中的元素個數