题目:
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] ]
代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
vector<int> visited;
if(nums.size()<=1){
result.push_back(nums);
return result;
}
func(nums,visited,result);
return result;
}
void func(vector<int> &nums,vector<int> &visited,vector<vector<int>> &result){
if(visited.size()==nums.size()){
result.push_back(visited);
return;
}
for(int i=0;i<nums.size();i++){
vector<int>::iterator iter;
iter=find(visited.begin(),visited.end(),nums[i]);
if(iter==visited.end()){
visited.push_back(nums[i]);
func(nums,visited,result);
visited.pop_back();
}
}
}
};
以一个数组维护遍历过的点:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> tmp;
vector<bool> visited(nums.size(),false);
help(ret,tmp,nums,visited);
return ret;
}
void help(vector<vector<int>> &ret,vector<int> &tmp,vector<int> &nums,vector<bool> &visited){
if(tmp.size()==nums.size()){
ret.push_back(tmp);
return;
}
for(int i=0;i<nums.size();i++){
if(!visited[i]){
tmp.push_back(nums[i]);
visited[i]=true;
help(ret,tmp,nums,visited);
tmp.pop_back();
visited[i]=false;
}
}
}
};
笔记:
- 典型回溯法(试探法),往前走一步,不通则退回,通则继续往前