[回溯]leetcode491:递增子序列(medium)

题目:
[回溯]leetcode491:递增子序列(medium)_第1张图片
题解:

  • 回溯法一般套路,生成组合问题,这里注重讲一下index吧。
  • 由于是生成组合并不是生成排序,所以进行下一次决策的话,我们需要将i+1,表示i表示的数字已经加入决策路径了,只有回溯回来的时候i+1会还原成i,然后++i,我们重新生成下一个组合。

代码如下:

class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        if(nums.empty())return {};
        set<vector<int>> res;//set来去重
        vector<int> track;
        backtrack(nums,res,track,0,nums.size());
        return vector<vector<int>> (res.begin(),res.end());
    }

    void backtrack(vector<int>& nums,set<vector<int>>& res,vector<int>& track,int index,int n){
        if(track.size()>=2)res.insert(track);
        for(int i=index;i<n;++i){
            //剪枝,不满足递增的剪掉
            if(!track.empty()&&track.back()>nums[i])continue;
            //choose:加入决策路径
            track.push_back(nums[i]);
            //i+1表示进行下一个分支
            backtrack(nums,res,track,i+1,n);
            //unchoose:移除决策路径
            track.pop_back();
        }
    }
};

你可能感兴趣的:(leetcode刷题,#,回溯)