Given a collection of distinct 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],
[3,2,1]
]
这道题其实就是在问给定一组数字求出这组数字的全排列是什么,思路比较简单,就是去把结果都列举出来存放在一个vector中就好了,核心的思路就是深度优先搜索。
代码如下:
class Solution {
public:
vector<vector<int> > permute(vector<int>& nums) {
vector<vector<int> > res;
vector<int> out;
vector<int> visited(nums.size(), 0);
search(0, nums, visited, out, res);
return res;
}
void search(int degree, vector<int> &nums, vector<int> &visited, vector<int> &out, vector<vector<int> > &res) {
if(degree == nums.size()) res.push_back(out);
for(int i = 0; i < nums.size(); i++) {
if(visited[i] == 0) {
visited[i] = 1;
out.push_back(nums[i]);
search(degree+1, nums, visited, out, res);
out.pop_back();
visited[i] = 0;
}
}
}
};
这里要说明的是res用来存储vector,每一个在res中的vector都是一个排列结果,vector nums代表题目给定的数据,vector visited是标记,当一个数字被访问存到vector out中时就被标为1,就不能被再次访问。至于degree则是代表vector out中有几个数据了,当degree达到题目给定数据的个数的时候就说明一个out里面已经有了一组答案,这时候就要把out存在res中。进行递归的搜索操作之后要弹出out中的数据,并且要把对应visited标为0(即没搜索过),以便于寻找另一组答案,这也是深搜的基本思想。当for循环全部结束以后,答案也就被全部找出。