非递减子序列
去重的方法不能使用之前的方法了,因为不能改变原始顺序。
所以引用undered_set来做去重操作。
vector<vector<int>> result;
vector<int> path;
void travel(vector<int>& nums, int starti){
if(path.size() >= 2)
result.push_back(path);
unordered_set<int> used;
for(int i = starti; i < nums.size(); i++){
if((path.size() == 0 || nums[i] >= path.back()) && used.find(nums[i]) == used.end()){
int path_size = path.size();
path.push_back(nums[i]);
used.insert(nums[i]);
travel(nums, i + 1);
if(path_size != path.size())
path.pop_back();
}
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
travel(nums, 0);
return result;
}
全排列I
通过unordered_set的方式来去重。
carl通过vector<bool> used 的方式做哈希表,一样的。
vector<vector<int>> result;
vector<int> path;
unordered_set<int> used;
void backing(vector<int>& nums, int k){
if(k > nums.size()){ //参数k也可以省略,换成result.size();
result.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++){
if(used.find(nums[i]) != used.end()){
continue;
}
used.insert(nums[i]);
path.push_back(nums[i]);
backing(nums, k + 1);
path.pop_back();
used.erase(nums[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
backing(nums, 1);
return result;
}
全排列II
剪枝还是不够熟练,得再多想下。
vector<vector<int>> result;
vector<int> path;
void backing(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)
continue;
if(i != 0 && nums[i] == nums[i - 1] && used[i - 1] == true)
continue;
used[i] = true;
path.push_back(nums[i]);
backing(nums, used);
path.pop_back();
used[i] = false;
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool> used (nums.size(), false);
sort(nums.begin(), nums.end());
backing(nums, used);
return result;
}