491. 递增子序列

发布时间 2023-04-15 13:51:49作者: xiazichengxi

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

> 解法一

class Solution {
private:
    void traversal(vector<int> &nums,int startdex){
       if(startdex > nums.size()) return;
       if(path.size() >= 2) res.emplace_back(path);
       std::unordered_map<int,bool> mp; 
       for(int i = startdex; i < nums.size(); i++){
            if(mp[nums[i]]) continue;
            if((path.empty()) || (!path.empty() && path.back() <= nums[i])){
                mp[nums[i]] = true;
                path.emplace_back(nums[i]);
                traversal(nums,i+1);
                path.pop_back();
            }
            else continue;
       }
    }
public:
    vector<vector<int>> res;
    vector<int> path;
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        res.clear();
        path.clear();
        traversal(nums,0);
        return res;
    }  
};

> 解法二

class Solution {
private:
    void traversal(vector<int> &nums,int startdex){
       if(startdex > nums.size()) return;
       if(path.size() >= 2) res.emplace_back(path);
       vector<bool> used(200,false);
       for(int i = startdex; i < nums.size(); i++){
            if(used[nums[i] + 100]) continue;
            if((path.empty()) || (!path.empty() && path.back() <= nums[i])){
                used[nums[i] + 100] = true;
                path.emplace_back(nums[i]);
                traversal(nums,i+1);
                path.pop_back();
            }
            else continue;
       }
    }
public:
    vector<vector<int>> res;
    vector<int> path;
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        res.clear();
        path.clear();
        traversal(nums,0);
        return res;
    }  
};