题目:491.递增子序列
文章链接:代码随想录
视频链接:LeetCode:491.递增子序列
题目链接:力扣题目链接
解法1:
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums, int startIndex){
// if(startIndex<path.size()|| path[path.size()-1]>nums[startIndex]){
// 往下递归,超过子串深度,以及出现所取元素小于子序列最后一个元素
// return;
// }
if(path.size()>1){
// 至少两个元素
result.push_back(path);
// return; 是每个都要放进去,所以不用直接return
}
unordered_set<int> uset; // 用set对本层元素进行去重
// 树层循环 startIndex的大小,控制则往下递归的深度,i的大小控制每层扩展的宽度
for(int i=startIndex; i<nums.size(); i++){
// 树层去重
if(!path.empty() && nums[i] < path.back() || uset.find(nums[i]) != uset.end()){
// path不为空的时候,放进的数小于path最后一个数
// find() == end() 说明没有。 != 说明有重复元素
continue;
}
uset.insert(nums[i]); // 记录本层出现过的元素
path.push_back(nums[i]);
backtracking(nums, i+1);
path.pop_back();
// uset 跟正常的回溯不一样,不需要回溯
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
result.clear();
path.clear();
backtracking(nums,0);
return result;
}
};
题目:46.全排列
文章链接:代码随想录
视频链接:LeetCode:46.全排列
题目链接:力扣题目链接
解法1:跟组合不同的是i每层都从0开始,用used控制
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums, vector<bool>used){
// 放入结果数组的判断
if(path.size() == nums.size()){
result.push_back(path);
return;
}
//
for(int i=0; i<nums.size(); i++){
// 如果没有使用过
if(used[i]==false){
used[i]=true;
path.push_back(nums[i]);
backtracking(nums,used);
used[i]=false;
path.pop_back();
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
vector<bool> used(nums.size(), false);
backtracking(nums,used);
return result;
}
};
题目:47.全排列 II
文章链接:代码随想录
视频链接:LeetCode:47.全排列||
题目链接:力扣题目链接
解法1:
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
void backtracking(vector<int>& nums, vector<bool>used){
// 放入结果数组的判断
if(path.size() == nums.size()){
result.push_back(path);
return;
}
//
for(int i=0; i<nums.size(); i++){
// 如果没有使用过
if(used[i]==true || (i>0 && nums[i]==nums[i-1] && used[i-1]==false)){
continue;
}
used[i]=true;
path.push_back(nums[i]);
backtracking(nums,used);
used[i]=false;
path.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
result.clear();
path.clear();
vector<bool> used(nums.size(), false);
sort(nums.begin(), nums.end()); // 不像上题一样需要递增子集,可以进行排序
backtracking(nums,used);
return result;
}
};