491. 递增子序列
回溯法没什么可说的,关键是如何去重,可以用set,也可以类似使用字符串hash。
还有就是下面这种做法。
假设有两个相同的元素,有四种情况,用0表示不选、1表示选。
0 0
0 1
1 0
1 1
发现3、4种情况重复了,于是强制如果当前元素和上一次选的元素重复的了,就必须要选。
class Solution {
public:
vector<vector<int>> ans;
vector<int> v;
vector<vector<int>> findSubsequences(vector<int>& nums) {
dfs(nums,-110,0);
return ans;
}
void dfs(const vector<int>& a,int last,int i){
if(i==a.size()){
if(v.size()>1) ans.push_back(v);
return;
}
if(a[i]>=last){
v.push_back(a[i]);
dfs(a,a[i],i+1);
v.pop_back();
}
if(a[i]!=last) dfs(a,last,i+1);
}
};