做法1:
class Solution {
private:
vector<vector<int>> res;
vector<int> group;
public:
void dfs(vector<int>& v){
if(v.size()==0){//计入结果的条件
res.push_back(group);
return;
}
for(int i=0;i<v.size();i++){
group.push_back(v[i]);
vector<int> v1(v);//构造一个新的容器,v1
v1.erase(v1.begin()+i);//在v1中删除刚刚放入group中的元素
dfs(v1);//除去v[i]剩余的元素进行dfs
group.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
dfs(nums);
return res;
}
};
本法效率较低。
做法2
按照官方解法写的,运行效率就提高了。
class Solution {
private:
vector<vector<int>> res;
public:
void dfs(int start,vector<int>& v,int len){
if(start==len-1){
res.push_back(v);
return;
}
for(int i=start;i<len;i++){
swap(v[i],v[start]);
dfs(start+1,v,len);
swap(v[i],v[start]);
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
int l=nums.size();
dfs(0,nums,l);
return res;
}
};
全排列II
本题就是在上题的基础上加上一个去重条件,因为如果和两个相同的值换的话则会出现重合,得到的是同一个数组的不同排列,在下一级进行重排时会出现重复。
判断值已经换过的方法是用,stl中的find()函数实现的。注意find函数返回的是停止搜索的指针。
vector<int>::iterator s=find(array.begin(),array.end(),50);
第一个参数是搜索的起始地址,第二个参数是搜索的结束地址,第三个参数是需要查找的值
/*除了start,其他和start值相同的值不换,和和前一个值相同的值不换(这一条其实可以删,但如果删了这个会降低效率)*/
if(v[i]==v[start]&&i!=start||i>start&&v[i]==v[i-1]){
continue;
}
/*和已经换过的相同的值不换*/
if(find(v.begin()+start,v.begin()+i,v[i])!=v.begin()+i){
continue;
}