Permutations
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] ]解析:两种方法
1. 每次固定第一个字符,把第一个数字和后面所有数字交换,求剩余数的全排列,这种方法是在原数组上进行的操作
2. 另外开辟一个数组path放结果,类似深度遍历,begin记录当前path中的数字个数,visited记录当前path中已经访问的数字元素。
代码:
1.
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>>ans;
permutation(nums,ans,0);
return ans;
}
void permutation(vector<int>&nums,vector<vector<int>>&ans,int begin)
{
if (begin==nums.size())
{
ans.push_back(nums);
return ;
}
for (int i=begin; i<nums.size(); i++)
{
int temp=nums[begin];
nums[begin]=nums[i];
nums[i]=temp;
permutation(nums,ans,begin+1);
temp=nums[begin];
nums[begin]=nums[i];
nums[i]=temp;
}
}
2.
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>>ans;
vector<int>path;
vector<bool>visited(nums.size(),false);
dfs(nums,ans,path,0,visited);
return ans;
}
void dfs (vector<int>&nums,vector<vector<int>>&ans,vector<int>&path,int begin,vector<bool>&visited)
{
if (begin==nums.size())
{
ans.push_back(path);
return ;
}
for (int i=0; i<nums.size(); i++)
{
if (visited[i]) continue;
visited[i]=true;
path.push_back(nums[i]);
dfs(nums,ans,path,begin+1,visited);
visited[i]=false;
path.pop_back();
}
}