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 天前
LeetCode 刷题【144. 二叉树的前序遍历】
数据结构·算法·leetcode
cynicme1 天前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
im_AMBER1 天前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
凯芸呢1 天前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
寂静山林1 天前
UVa 1030 Image Is Everything
算法
AI柠檬1 天前
几种排序算法的实现和性能比较
数据结构·算法·c#·排序算法
weixin_429630261 天前
第6章 支持向量机
算法·机器学习·支持向量机
SweetCode1 天前
C++ 实现大数加法
开发语言·c++·算法
王哈哈^_^1 天前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计