算法刷题记录 Day25
Date: 2024.03.20
lc 47. 全排列II
class Solution {
private:
vector<vector<int>> res;
public:
void backTracking(vector<int>& nums, vector<int>& visited, vector<int>& cur){
if(cur.size() == nums.size()){
res.push_back(cur);
return;
}
// 如何去重?跳过每层遍历时的相同元素,仅保留第一个
for(int i=0; i<nums.size(); i++){
// 如果i>0 且 nums[i]和nums[i-1]相同,跳过
if(i > 0 && nums[i] == nums[i-1])
continue;
if(visited[i] == 0){
cur.push_back(nums[i]);
visited[i] = 1;
backTracking(nums, visited, cur);
cur.pop_back();
visited[i] = 0;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<int> cur;
vector<int> visited(nums.size(), 0);
backTracking(nums, visited, cur);
return res;
}
};
lc 46. 全排列
// 使用visited数组判断是否访问
class Solution {
private:
vector<vector<int>> res;
public:
void backTracking(vector<int>& nums, vector<int>& visited, vector<int>& cur){
if(cur.size() == nums.size())
res.push_back(cur);
for(int i=0; i<nums.size(); i++){
if(visited[i] == 0){ //未访问
cur.push_back(nums[i]);
visited[i] = 1;
backTracking(nums, visited, cur);
cur.pop_back();
visited[i] = 0;
}
}
return;
}
vector<vector<int>> permute(vector<int>& nums) {
vector<int> visited(nums.size(), 0);
vector<int> cur;
backTracking(nums, visited, cur);
return res;
}
};
lc 491. 递增子序列
class Solution {
private:
vector<vector<int>> res;
public:
void backTracking(vector<int>& nums, vector<int>& cur, int cur_idx){
// 怎么去重?
if(cur.size() >= 2)
res.push_back(cur);
if(cur_idx >= nums.size())
return;
int size = cur.size();
unordered_set<int> s;
for(int i=cur_idx; i<nums.size(); i++){
// 若该层的某个值已经被使用过,则不能再次使用
if((size == 0 || nums[i] >= cur[size-1]) && s.find(nums[i]) == s.end()){
cur.push_back(nums[i]);
s.emplace(nums[i]);
backTracking(nums, cur, i+1);
cur.pop_back();
}
}
return;
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
vector<int> cur;
int cur_idx = 0;
backTracking(nums, cur, cur_idx);
return res;
}
};