---
# System prepended metadata

title: 491. Non-decreasing Subsequences
tags: [Leetcode]

---

<style>
    html, body, .ui-content {
    background: #222222;
    color: #00BFFF;
}
    /* 設定 code 模板 */
    .markdown-body code,
.markdown-body tt {
    background-color: #ffffff36;
}
.markdown-body .highlight pre,
.markdown-body pre {
    color: #ddd;
    background-color: #00000036;
}
.hljs-tag {
    color: #ddd;
}
.token.operator {
  background-color: transparent;
}    
/* 設定連結 */
a,
.open-files-container li.selected a {
    color: #89FFF8;
    
}
a:hover,
.open-files-container li.selected a:hover {
    color: #89FFF890;
}
   
</style>

###### tags: `Leetcode`

# 491. Non-decreasing Subsequences

###### Link : https://leetcode.com/problems/non-decreasing-subsequences/description/

## 題目
回傳遞增的所有子陣列
## 程式碼 I(位元運算)
假設數組為{1, 2, 3}
則
0 0 0 => { }
0 0 1 => { 1 }
0 1 0 => { 2 }
0 1 1 => { 1, 2}
1 0 0 => { 3 }
1 0 1 =>{1 , 3}
1 1 0 => {2 , 3}
1 1 1 => {1, 2, 3}
原文網址：https://kknews.cc/code/xvekqrr.html
```cpp=
class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        const int n = nums.size(), length = pow(2, nums.size());
        set<vector<int>> res;
        for(int i = 0;i < length;i++){
            vector<int> temp;
            for(int j = 0;j < n;j++){
                if(i & (1 << j)){
                    //遇到數字不符合條件 清空temp 跳出迴圈
                    if(temp.size() > 0 && temp[temp.size() - 1] > nums[j]){
                        temp.clear();
                        break;
                    }
                    temp.push_back(nums[j]);
                }
            }
            if(temp.size() > 1)
                res.insert(temp);
        }
        return vector(res.begin(), res.end());
    }
};
```
## 程式碼 II(Better Solution/Recursion)
```cpp=
class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        set<vector<int>> res;
        //利用set避免重複的答案
        vector<int> data;
        Solve(res, data, nums, 0);
        return vector(res.begin(), res.end());
    }
    void Solve(set<vector<int>> &res, vector<int> &data, vector<int> &nums, int index){
        if(index >= nums.size()){//陣列走訪完畢
            if(data.size() >= 2){//長度大於等於二需加入答案
                res.insert(data);
            }
            return;
        }
        //如果還在遞增的話
        if(!data.size() || data.back() <= nums[index]){
            data.push_back(nums[index]);
            //有目前數字的可能
            Solve(res, data, nums, index + 1);
            data.pop_back();
        }
        //沒有目前數字的可能
        Solve(res, data, nums, index + 1);
        return;
    }
};
```
## Date 
### 2023/1/20