題目:
題解:
- 回溯法一般套路,生成組合問題,這裏注重講一下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();
}
}
};