首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 78 Subsets 子集生成 位運算與回溯

     編輯:關於C++

問題

給定無重複整數數組,返回所有可能子集(冪集)。元素升序,無重複子集。

方法一:位運算枚舉

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; 去重。位運算法需額外去重集合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved