
这道题主要是在剪枝条件里去做处理,把可能重复的组合给去掉,同时不符合递增条件的组合也去掉
但是,问题是去重操作是不允许改变元素在序列的次序的,这也就意味着采用组合II这道题先排序,把相同元素聚拢再跳过的策略是不适用的。只能采用类似集合set
的办法来判断是否有同类元素出现过。(当然,我认为如果把初始的元素值和初始位置数据存到pair里,也是一个好办法,后序做法就和组合II没什么两样)
cpp
class Solution {
public:
vector<vector<int>> res;
vector<int> resVec;
vector<bool> visit;
void resInit(vector<int>& nums) {}
bool isValid(vector<int> resVec, vector<int>& nums, unordered_set<int> chooseSet,int index) {
if (resVec.size() > 0) {
int curMax = resVec[resVec.size() - 1];
if (curMax > nums[index]) {
return false;
}
}
if(chooseSet.count(nums[index]) > 0) {
return false;
}
return true;
}
void traceback(vector<int> resVec, vector<int>& nums, int start) {
unordered_set<int> chooseSet;
for (int i = start; i < nums.size(); i++) {
if (!isValid(resVec, nums, chooseSet,i)) {
continue;
}
chooseSet.insert(nums[i]);
resVec.push_back(nums[i]);
traceback(resVec, nums, i + 1);
resVec.pop_back();
}
if (resVec.size() >= 2) {
res.push_back(resVec);
}
return;
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
resInit(nums);
traceback(resVec, nums, 0);
return res;
}
};
全排列,无重元素不可复取
cpp
class Solution {
public:
vector<vector<int>> res;
vector<int> resVec;
vector<bool> visit;
void resInit(vector<int>& nums){
vector<bool> visitTem(nums.size(),false);
visit = visitTem;
}
bool isValid(vector<bool> &visit,int i){
if(visit[i]){
return false;
}
return true;
}
void tracebcak(vector<int> resVec,vector<int>& nums,vector<bool> visit){
if(resVec.size() == nums.size()){
res.push_back(resVec);
return;
}
for(int i = 0;i< nums.size();i++){
if(!isValid(visit,i)){
continue;
}
visit[i] = true;
resVec.push_back(nums[i]);
tracebcak(resVec,nums,visit);
visit[i] = false;
resVec.pop_back();
}
}
vector<vector<int>> permute(vector<int>& nums) {
resInit(nums);
tracebcak(resVec,nums,visit);
return res;
}
};
有重排列不可复取
cpp
class Solution {
public:
vector<vector<int>> res;
vector<int> resVec;
vector<bool> visit;
void resInit(vector<int>& nums){
sort(nums.begin(),nums.end());
vector<bool> visitTem(nums.size(),false);
visit = visitTem;
}
bool isValid(vector<int>& nums,vector<bool> &visit,int i){
if(visit[i]){
return false;
}
if(i - 1 >=0 && !visit[i-1] && nums[i-1] == nums[i] ){
return false;
}
return true;
}
void traceback(vector<int> resVec,vector<int>& nums,vector<bool> visit){
if(resVec.size() == nums.size()){
res.push_back(resVec);
return;
}
for(int i = 0;i< nums.size();i++){
if(!isValid(nums,visit,i)){
continue;
}
visit[i] = true;
resVec.push_back(nums[i]);
traceback(resVec,nums,visit);
visit[i] = false;
resVec.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
resInit(nums);
traceback(resVec,nums,visit);
return res;
}
};