LeetCode 78 Subsets

154 阅读1分钟

LeetCode 78 Subsets

思路

回溯

关键点在于,使用一个变量记录那些元素已经考虑过。那么下次应该直接从该元素之后开始考虑。

迭代(没想到)

将当前结果集中的每个元素和新元素组合,然后放入结果集中。

代码

回溯

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> rs;
        vector<int> set;
        addSet(rs, nums, set, 0);
        
        return rs;
    }
    
    void addSet(vector<vector<int>> &rs, vector<int> &nums, vector<int> set, int cur) {
        rs.push_back(set);
        
        for (int i = cur; i < nums.size(); ++i) {
            set.push_back(nums[i]);
            addSet(rs, nums, set, i + 1);
            set.pop_back();
        }
    }
};

迭代

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> rs{{}};
        
        for (const auto &num : nums) {
            int n = rs.size();
            for (int i = 0; i < n; ++i) {
                rs.push_back(rs[i]);
                rs.back().push_back(num);
            }
        }
        
        return rs;
    }
};