Leetcode 491. 递增子序列
题目链接 491 递增子序列
本题目和前面的树层去重不太一样,因为这里不能对原集合进行排序,所以之前的去重就没法使用了,只能单纯的记录该元素有没有使用过(去重),下面使用的是set结构来存储之前的取过的元素,上代码:
class Solution {private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int startIndex){if(path.size()>1){result.push_back(path);}unordered_set<int> uset;for(int i=startIndex;i<nums.size();i++){if(!path.empty()&&path.back()>nums[i]||uset.find(nums[i])!=uset.end()){//在set中找到了nums[i],存在元素continue;}uset.insert(nums[i]);//记录,path.push_back(nums[i]);backtracking(nums,i+1);//回溯时不用删除前面uset的标记path.pop_back();}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums,0);return result;}
};
Leetcode 46. 全排列
题目链接 46 全排列
本题目思路还是比较简单的,我们不再需要递归中的startIndex+1(for循环中也不是从startIndex开始),所以,startIndex我们就用不到了,只需在递归中标记下出现过的元素下标,递归时不再重复即可,for循环中从0下标开始,每个元素都遍历一遍,下面上代码:
class Solution {private: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){continue;}//递归中取过的元素就不用取了used[i] = true;path.push_back(nums[i]);backtracking(nums,used);used[i] = false;path.pop_back();}}
public:vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(),false);backtracking(nums,used);return result;}
};
Leetcode 47. 全排列 II
题目链接 47 全排列 II
该题目对于全排列一的区别就在于,集合中有重复元素,我们求的全排列要求没有重复集合,这里我们遇到重复的就得进行去重操作,(树层去重)一句话,前面元素和下一位元素相同,取前面元素的集合情况一定包含取下一位元素集合的情况,所以我们只需取前面一位的情况即可,下面上代码:
class Solution {private: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(i>0&&nums[i-1] == nums[i]&&used[i-1] == false){continue;//取相同元素的第二个,这种是不成立的}if(used[i] == false){used[i] = true;path.push_back(nums[i]);backtracking(nums,used);used[i] = false;path.pop_back();}}}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());vector<bool> used(nums.size(),false);backtracking(nums,used);return result;}
};
end