任务日期:7.1
题目一链接:491. 非递减子序列 - 力扣(LeetCode)
思路:利用回溯算法先dfs整个数组,然后选择符合条件的存入result之中。本体特殊点在于需要一个哈希表集合来存储同层已经被使用过的元素。
代码:
class Solution {
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int> &nums,int startindex) {
if(path.size() > 1) {
result.push_back(path);
//没有return因为要取树上的所有节点
}
unordered_set<int> visited;//记录同层已经用过的数,避免重复且自动清空
for(int i = startindex;i < nums.size();i ++) {
if((!path.empty() && nums[i] < path.back()) || visited.count(nums[i])) {
continue;
}
path.push_back(nums[i]);
visited.insert(nums[i]);
backtracking(nums,i + 1);//必须是i + 1而不能是++ i或者是i ++,因为是后缀表达式,会返回i
//回溯
path.pop_back();
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
result.clear();
path.clear();
backtracking(nums,0);
return result;
}
};
难点:1.backtracking里面的的i + 1而不是++i;
2.回溯算法里面的确定终止递归的条件
解释细节1:
题目二链接:
思路:
代码:
难点:
解释细节1:
题目三链接:
思路:
代码:
难点:
解释细节1: