原题如下:
Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:
[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
思路:此题与上一篇文章中所说的n皇后问题有点相似,但比n皇后问题简单,采用的方法仍是深度搜索。
具体步骤:
创建一个map用于记录数组中的元素是否已被插入当前的序列中,若插入记为1,初始时设置为0。从第一个位置开始遍历,每次都对map中的所有元素进行遍历,遇到没有插入的元素将其插入当前位置,并将其标志设置为1,然后前进一个位置递归遍历,直到遍历到第n个位置构成一个完整的排列,完成一次递归。需要注意的是在每次递归返回时记得将插入的元素从vector中抛出并将其标志位置0,即回到递归前的状态,这点儿很重要啊!上代码:
class Solution {
public:
vector<vector<int>>vv;
vector<vector<int>> permute(vector<int> &num) {
if(num.size() == 0)
return vv;
map<int,int>flag;
vector<int>v;
int len = num.size();
for(int i = 0; i < len;i++){
flag[num[i]] = 0;
}
DFS(0,len,flag,v);
return vv;
}
void DFS(int x,int n,map<int,int>&flag,vector<int>&v){//x跟踪当前的位置,n为总元素个数,flag为元素是否插入的标志,vector用于存放当前已插入的元素
if( x == n){
vv.push_back(v);
//v.clear();这样直接清空不行,因为它只对当前有效,再返回递归的上一层时vector并不为空,必须递归结束一次清除一个元素
return;
}
for(map<int,int>::iterator it = flag.begin();it != flag.end();it++){
if(it->second == 0){
v.push_back(it->first);
it->second = 1;
DFS(x + 1, n,flag,v);
it->second = 0;
v.pop_back();
}
}
}
};