思路:

当成求子集问题去处理。

用到了树层去重操作。

储备:

代码随想录

代码随想录 中关于哈希的知识。看看。因为跳过了哈希。但看这篇足够解这道题

问题重点:

最后:

用数组去重:

class Solution {//用数组去重
public:

    vector<vector<int>> res;
    vector<int> path;

    void trace(vector<int>& nums, int st) {

        if (path.size()>1) res.push_back(path);//遍历所有节点。不返回。

        // unordered_set<int> uset;
        int used[201]={0};//每层新建一个,用于本层去重
        for (int i=st;i<nums.size();i++) {
            if ((!path.empty() && nums[i]<path.back()) //排除不递增的情况
                || used[nums[i]+100])//nums[]范围为[-100,100],加了之后变成[0,200]一共201个
                continue;
            // uset.insert(nums[i]);
            used[nums[i]+100]++;
            path.push_back(nums[i]);
            trace(nums,i+1);
            path.pop_back();
        }
        return ;
    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {
        trace(nums,0);
        return res;
    }
};

用unordered_set去重:

class Solution {
public:

    vector<vector<int>> res;
    vector<int> path;

    void trace(vector<int>& nums, int st) {

        if (path.size()>1) res.push_back(path);//遍历所有节点。不返回。

        unordered_set<int> uset;//每层新建一个,用于本层去重
        for (int i=st;i<nums.size();i++) {
            if ((!path.empty() && nums[i]<path.back()) //排除不递增的情况
                || uset.find(nums[i])!=uset.end())//找到了说明之前用过了,同样不行。下一层可以用,但在本层不能用
                continue;
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            trace(nums,i+1);
            path.pop_back();
        }
        return ;
    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {
        trace(nums,0);
        return res;
    }
};

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐