Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
题目:给定不同的整数序列,输出所有可能的序列。这个题目没说给出重复的整数。
解题思路:使用dfs,这与我们上面解过的subset题目类似。不过这里是得到集合的全排列,dfs结束条件要是temp.size==nums.size。而且for循环不能从上次k往下面循环,而是每次递归要从0开始循环。为了保证每个数据加入一次,建立一个nums.size大小的数组作为标志数组。
代码:
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
void dfs(vector<vector<int> >& numList,vector<int>& temp,vector<int>& nums,bool visit[]){
if(temp.size()==nums.size()){ //临时存储数组等于给定数组长度时,添加到numList中
numList.push_back(temp);
return;
}else{
for(int i=0;i<nums.size();i++){ //每次递归for循环从0开始
if(visit[i]==false){ //临时数组是否添加数字的标志位
temp.push_back(nums[i]);
visit[i] = true;
dfs(numList,temp,nums,visit);
temp.pop_back(); //剔除return的最后一个数据
visit[i] = false; //同时标志位置false
}
}
}
}
int main()
{
vector<int> nums;
vector<vector<int> > numList;
int s;
while(cin>>s){
nums.push_back(s);
}
sort(nums.begin(),nums.end());
vector<int> temp;
int n= nums.size();
bool visit[n];
for(int i=0;i<n;i++){
visit[i] = false;
}
dfs(numList,temp,nums,visit);
for(int i=0;i<numList.size();i++){
for(int j=0;j<numList[i].size();j++){
cout << numList[i][j]<<" ";
}
cout << endl;
}
return 0;
}
对于Permutations II 的题目,输入存在相同数字的序列。在pop数据后,直接到和上次添加数据不同的数据。
代码::
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
void dfs(vector<vector<int> >& numList,vector<int>& temp,vector<int>& nums,bool visit[]){
if(temp.size()==nums.size()){
numList.push_back(temp);
return;
}else{
for(int i=0;i<nums.size();i++){
if(visit[i]==false){
temp.push_back(nums[i]);
visit[i] = true;
dfs(numList,temp,nums,visit);
temp.pop_back();
visit[i] = false;
while(i<nums.size()-1 && nums[i]==nums[i+1])
i++;
}
}
}
}
int main()
{
vector<int> nums;
vector<vector<int> > numList;
int s;
while(cin>>s){
nums.push_back(s);
}
sort(nums.begin(),nums.end());
vector<int> temp;
int n= nums.size();
bool visit[n];
for(int i=0;i<n;i++){
visit[i] = false;
}
dfs(numList,temp,nums,visit);
for(int i=0;i<numList.size();i++){
for(int j=0;j<numList[i].size();j++){
cout << numList[i][j]<<" ";
}
cout << endl;
}
return 0;
}