一:论语
二:题目
三:上码
class Solution {
public:
vector<vector<int> >ans;
vector<vector<int> >ans1;
vector<int> path;
void backstacking(vector<int>& nums,int index) {
if(path.size() >= 2) {
ans.push_back(path);
}
unordered_set<int> uset; // 使用set对本层元素进行去重
for(int i = index; i < nums.size(); i++) {
//当递归到这层的时候 如果我们不是递增的时候就直接跳过
if(!path.empty() && nums[i] < path.back()) continue;
if(uset.find(nums[i]) != uset.end()) continue;//去重 不等于最后一个元素的话 那么就是
//容器中有这个元素
uset.insert(nums[i]);
path.push_back(nums[i]);
backstacking(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
/**
思路:1.这里我们处理递增顺序的时候需要注意的 我们在回溯的递归中 纵向的递归中 我们用 nums[i]
和path.back() 进行比较 如果不是递增的话 那么我们就选择 continue 越过本次的for循环的
一个元素
2.注意题目中说的是不同的递增子序列,那么我们还是双管齐下 第一管:我们设置 index
第二管:我们先排序的话 然后的话 再在回溯的横向遍历的时候 遇见相同的元素 直接跳过
但这并不影响 纵向遍历的时候 遇见相同的元素还可以在path中 但是本题中我们不能排序
但是我们们可以设置一个set容器来解决
*/
backstacking(nums,0);
return ans;
}
};
晚安!