题解:
代码随想录讲解图:
可以看到该题需要注意两点:
1、去重 是同一父结点下同层不能重复使用
2、确保序列是递增序列 所取的值需要大于已有序列的最后一个元素
回溯三部曲:
1、确定回溯函数的参数
void backtracking(vector<int> nums,int startIndex)
2、确定递归终止条件
startIndex==nums.size时停止
3、确定单层搜索过程
for循环控制横向遍历 递归纵向遍历 注意去重和收集结果
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int> nums,int startIndex){
if(startIndex==nums.size()){
return;
}
//单层搜索过程
//使用set来对本层元素进行去重
unordered_set<int> uset;
for(int i = startIndex;i<nums.size();i++){
//数组非空且该元素小于数组最后一个元素 或者该元素已经使用过 跳过不选取
if(!path.empty()&&nums[i]<path.back() || uset.find(nums[i])!=uset.end()){
continue;
}
//否则 记录使用过
uset.insert(nums[i]);
path.push_back(nums[i]);
if(path.size()>1){
result.push_back(path);
}
backtracking(nums,i+1);
path.pop_back();
}
return;
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtracking(nums,0);
return result;
}
};