题目:
题解:
- 回溯法一般套路,生成组合问题,这里注重讲一下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();
}
}
};