加油加油!相当于晚上22点20开始,看看需要多久
491.递增子序列
关于疑问都写在里面了,目前最大的疑问是return似乎不需要。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
// bool used[201] = {false};//放这里会误伤,相当于只要这个值用过,就跳过
void backtracking(vector<int>& nums,int index){
if(path.size() >= 2)result.push_back(path);
if(index >= nums.size())return;//这个可有可无?为啥
bool used[201] = {0};//放这里相当于每一层重新记录一次,这层用过就算用过
for(int i = index;i<nums.size();i++){
if((!path.empty() && nums[i] < path.back())
|| used[nums[i]+100] == 1)continue;
used[100+nums[i]] = 1;
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
result.clear();
path.clear();
backtracking(nums,0);
return result;
}
};
46.全排列
和代码随想录的答案比,少了一个return,我麻了,需要学一下return什么时候可以加什么时候不加了。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>& nums,vector<bool>& used){
if(path.size() == nums.size()){
result.push_back(path);
}
for(int i = 0;i < nums.size();i++){
if(used[i] == true)continue;
used[i] = true;
path.push_back(nums[i]);
backtracking(nums,used);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permute(vector<int>& nums) {
result.clear();
path.clear();
vector<bool>used(nums.size(),false);
backtracking(nums,used);
return result;
}
};
47.全排列 II
这题和491的区别在于,491不是用数组的全部内容,所以path的终止条件都不太一样,这题要去类比90。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>& nums,vector<bool>& used){
if(path.size() == nums.size()){
result.push_back(path);
}
for(int i = 0;i < nums.size();i++){
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)continue;
if(used[i] == true)continue;
used[i] = true;
path.push_back(nums[i]);
backtracking(nums,used);
path.pop_back();
used[i] = false;
}
}
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;
}
};