LeetCode 491 递增子序列 - 回溯解法

LeetCode 491 递增子序列 - 回溯解法

https://leetcode.cn/problems/non-decreasing-subsequences/description/

思路

和求子集问题类似,函数语义为:从index 到最后中选择一个数加入到path中。


for(int i = index;i<max;i++){
	if(loc[i]合法){
		加入
		addPath(i+1)
		pop
	}

}

但是, 会有重复的问题, [4,6,7,7]

所以还要去重,这里的重复是 你和兄弟们的重复 两个 467 重复了,在 for 循环遍历到 第一个7 后,第二个 7 就不该遍历, 针对这种可以借鉴之前[组合总和2](LeetCode 40 组合总和 II - 回溯解法.md) 设置 last 来存储上一次的值。

数据范围<100 设置为101
int last = 101
for(int i = index;i<max;i++){
	if(loc[i]==last) continue;
	if(loc[i]合法){
		加入
		addPath(i+1)
		pop
	}

}

提交后发现没通过,[4,6,7,7,4,4]

这里 last=7 不起作用, 因此要设置 used 数组,每回加入的时候要查一下。

use[101]  全是101
for(int i = index;i<max;i++){
	if(used(loc[i])) continue;
	if(loc[i]合法){
		加入
		addPath(i+1)
		pop
	}

}

代码

class Solution {

public:

    vector<int> loc_nums;

    vector<int> path;

    vector<vector<int>> result;

    bool is_used(vector<int> use, int value) {

        for (int i = 0; i < use.size(); i++) {

            if (use[i] == value) {

                return true;

            }

        }

        return false;

    }

    void add_path(int index) {

        if (path.size() >= 2) {

            result.push_back(path);

        }

        vector<int> use(loc_nums.size()-index,101);

        for (int i = index; i < loc_nums.size(); i++) {

            if (is_used(use, loc_nums[i]))

                continue;

            use.push_back(loc_nums[i]);

            if (path.size() == 0 || loc_nums[i] >= path.back()) {

                path.push_back(loc_nums[i]);

                add_path(i + 1);

                path.pop_back();

            }

        }

    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {

        loc_nums = nums;

        add_path(0);

        return result;

    }

};