LeetCode 刷题【90. 子集 II】

90. 子集 II

自己做

解:递归选取

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;

public:
    void collect_set(vector<int>& nums, vector<int> combine, int i, bool gain){              //i为当前的下标,gain标记上个元素是否取过
        if(i == (int)nums.size()){
            res.push_back(combine);
            return;
        }

        //不取
        collect_set(nums, combine, i + 1, false);

        //取
        combine.push_back(nums[i]);
        if(i > 0 && nums[i] == nums[i - 1] && gain)                                         //相同元素且上个元素取过
            collect_set(nums, combine, i + 1, true);
        else if(i == 0 || i > 0 && nums[i] != nums[i - 1])                                  //不同元素无所谓
            collect_set(nums, combine, i + 1, true);

    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        collect_set(nums, vector<int>(), 0, true);
        return res;
    }
};

看题解

把递归的变量掏出来

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> combine;

public:
    void collect_set(vector<int>& nums, int i, bool gain){              //i为当前的下标,gain标记上个元素是否取过
        if(i == (int)nums.size()){
            res.push_back(combine);
            return;
        }

        //不取
        collect_set(nums, i + 1, false);

        //取
        if(i > 0 && nums[i] == nums[i - 1] && !gain)                                         //相同元素且上个元素没取过,直接返回
            return;

        combine.push_back(nums[i]);
        collect_set(nums, i + 1, true);
        combine.pop_back();

    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        collect_set(nums, 0, true);
        return res;
    }
};
相关推荐
软件测试雪儿1 分钟前
自动化测试面试真题(附答案)
软件测试·测试工具·面试·职场和发展
吃着火锅x唱着歌2 分钟前
LeetCode 3185.构成整天的下标对数目II
算法·leetcode·职场和发展
鱼鱼块13 分钟前
《最小栈的巧妙设计:用辅助栈实现 O(1) 获取最小值》
javascript·算法·面试
San3014 分钟前
反转字符串与两数之和:两道简单题背后的 JavaScript 思维深度
javascript·算法·面试
喜欢吃燃面20 分钟前
算法竞赛中的堆
c++·学习·算法
资深web全栈开发23 分钟前
LeetCode 1590:使数组和能被 p 整除(前缀和 + 哈希表优化)
算法·leetcode·前缀和·算法优化·哈希表·go 语言·取模运算
CoderYanger36 分钟前
递归、搜索与回溯-综合练习:27.黄金矿工
java·算法·leetcode·深度优先·1024程序员节
zs宝来了37 分钟前
HOT100系列-堆类型题
数据结构·算法·排序算法
Christo31 小时前
ICML-2019《Optimal Transport for structured data with application on graphs》
人工智能·算法·机器学习·数据挖掘
sin_hielo1 小时前
leetcode 1590
数据结构·算法·leetcode