题目
解题思路
都是很明显的搜索问题,这种涉及到全部的解空间,然后所有的解有一定的规律性的问题,用dfs递归比较容易解决
01:BM55 没有重复项数字的全排列
02:BM56 有重复项数字的全排列
02在01的基础上,加一行判断元素是否重复,就可以了,如果重复,就不需要在dfs了,如果不重复,和01的代码逻辑一模一样
代码
01:BM55 没有重复项数字的全排列
class Solution {
public:
vector<int> temp;//储存全排列的一组数
vector<vector<int> >result;//储存所有的全排列的数组,按照字典序
void dfs(vector<int> &num){
//终止条件,数组为空,此时push进去temp
if(num.size()==0){
result.push_back(temp);
return;
}
//dfs,按照字典序,遍历num所有元素
for(int j=0;j<num.size();j++){
//temp中加入新元素
temp.push_back(num[j]);
vector<int>subvec;//子序列
if(num.size()==1) dfs(subvec);
else{
for(int i=0;i<num.size();i++){
if(i==j) continue;
subvec.push_back(num[i]);
}
//对子序列进行dfs
dfs(subvec);
}
//回溯,把这个元素再踢出去
temp.pop_back();
}
}
vector<vector<int> > permute(vector<int> &num) {
int n=num.size();
sort(num.begin(), num.end());//先按照字典序进行排序
dfs(num);//开始dfs
return result;
}
};
02: BM56 有重复项数字的全排列
class Solution {
public:
vector<int> temp;
vector<vector<int> >result;
void dfs(vector<int> &num){
if(num.size()==0){
result.push_back(temp);
return;
}
for(int j=0;j<num.size();j++){
if(j>0 && num[j]==num[j-1]) continue;//判断是否是重复元素,如果是,不进行dfs
temp.push_back(num[j]);
vector<int>subvec;
if(num.size()==1) dfs(subvec);
else{
for(int i=0;i<num.size();i++){
if(i==j) continue;
subvec.push_back(num[i]);
}
dfs(subvec);
}
temp.pop_back();
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
int n=num.size();
sort(num.begin(), num.end());
dfs(num);
return result;
}
};