public:
vector<vector<int>> permute(vector<int>& nums) {
int i;
int len=nums.size();
for(i=0;i<len;i++)
{
dfs(nums,i);
ivec.clear();
map1.clear();
}
return result;
}
void dfs(vector<int>&nums,int i)
{
int j,k;
len=nums.size();
ivec.push_back(nums[i]);
map1[nums[i]]=1;
if(ivec.size()==nums.size())
{
result.push_back(ivec);
//ivec.clear();
//map1.clear();
return;
}
for(j=0;j<len;j++)
{
if(!map1.count(nums[j]))
{
dfs(nums,j);
k=ivec.back();
ivec.pop_back();
map1.erase(k);
}
}
// ivec.clear();
// map1.clear();
}
private: int len;
vector<int>ivec;
vector<vector<int>> result;
map<int,int>map1;
};
可以直接用vector 做。其实是用类似于深搜的做法,这个是回溯的办法,push进去一定要pop;即dfs每层玩了要pop一下,可以保持回溯。不清楚一定要画图分析。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
int i=0,count=0;
int len=nums.size();
for(i=0;i<len;i++)
{
dfs(nums,i);
ivec.clear();
//map1.clear();
}
return result;
}
void dfs(vector<int>&nums,int i)
{
int j;
len=nums.size();
ivec.push_back(nums[i]);
// map1[nums[i]]=1;
if(ivec.size()==nums.size())
{
result.push_back(ivec);
//j=ivec.back();
//ivec.pop_back();
//map1.erase(j);
return;
}
/* if(nums.size()<=2&&(ivec.size()==nums.size()))
{
result.push_back(ivec);
j=ivec.back();
ivec.pop_back();
//map1.erase(j);
return;
}*/
// map1[nums[i]]=1;
for(j=0;j<len;j++)
{
//if(map1.find(nums[j])==map1.end())
if(find(ivec.begin() , ivec.end() , nums[j]) == ivec.end())
{
dfs(nums,j);
ivec.pop_back(); //重要一步,回溯。
}
//if(find(ivec.begin(),ivec.end(),nums[j])==ivec.end()) dfs(nums,j);
}
//count=1;
}
private: int len;
vector<int>ivec;
vector<vector<int>> result;
//map<int,int>map1;
//int count;
};