給定無重複整數數組,返回所有可能子集(冪集)。元素升序,無重複子集。
n 個元素對應 n 位二進制數,0/1 表示不選/選。0 到 2ⁿ-1 每個數對應一個子集。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<vector<int>> res;
for (int mask = 0; mask < (1<
方法二:回溯(DFS)
遞歸構建:每步決定「選」或「不選」當前元素,或用 start 索引避免排列重複。
class Solution {
void dfs(vector<int>& nums, int start, vector<int>& path, vector<vector<int>>& res) {
res.push_back(path);
for (int i = start; i < (int)nums.size(); ++i) {
path.push_back(nums[i]);
dfs(nums, i+1, path, res);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
vector<int> path;
dfs(nums, 0, path, res);
return res;
}
};
複雜度對比
方法 時間 空間(不計輸出) 特點
位運算 O(n·2ⁿ) O(1) 簡單,無遞歸開銷
回溯 O(n·2ⁿ) O(n) 自然生成有序子集,易擴展
擴展:Subsets II(含重複元素)
回溯法中加入 if (i > start && nums[i] == nums[i-1]) continue; 去重。位運算法需額外去重集合。