代码随想录算法训练营第二十四天|leetcode78、90、93题-二、leetcode第78题

本题要求给定整数数组的子集,也就是将构建的树的每个叶子结点的值收集起来加入结果数组。

具体代码如下:

class Solution {
public:
    vector<int>tmp;
    vector<vector<int>>result;
    vector<vector<int>> subsets(vector<int>& nums) {
    backtracking(nums,0);
    return result;
    }
    void backtracking(vector<int>nums,int start)
    {
        result.push_back(tmp);
        if(start>nums.size())
        {
            return;
        }
        for(int i=start;i<nums.size();i++)
        {
            tmp.push_back(nums[i]);
            backtracking(nums,i+1);
            tmp.pop_back();
        }
    }
};

三、leetcode第90题

本题给定的数组中有重复元素,要求子集不重复,也就是需要对子集进行去重操作,这需要构建一棵树并区分树枝和树层,如果在同一树层上的结点值相同则需要去重,树枝上值相同不需要去重,判断值是否相同以及相同的值是否使用过成为去重的关键条件,这里用一个bool数组来记录结点是否使用过。

具体代码如下:

class Solution {
public:
    vector<vector<int>>result;
    vector<int>path;
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    sort(nums.begin(),nums.end());
    vector<bool>judge(nums.size(),false);
    backtracking(nums,0,judge);
    return result;
    }
    void backtracking(vector<int>nums,int start,vector<bool>&used)
    {
        result.push_back(path);
        for(int i=start;i<nums.size();i++)
        {
            if(i>0&&nums[i-1]==nums[i]&&used[i-1]==false)
            {
                continue;
            }
            path.push_back(nums[i]);
            used[i]=true;
            backtracking(nums,i+1,used);
            used[i]=false;
            path.pop_back();
        }
    }
};

上一篇:SpringWEB组件及运行流程


下一篇:linux下永久添加静态路由-不同