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

題目:
在這裏插入圖片描述
題解:

  • 回溯法一般套路,生成組合問題,這裏注重講一下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();
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章