题目描述 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路
- 深度优先搜索,当序列中的元素不重复时,存在 n! 种不同的排列;
- 考虑第一个位置,有 n 种可能
- 当选定了第一个位置,第二个位置有 n-1 种可能
- 因为每次搜索的状态数是递减的,所以这里的 dfs 是一个循环递归的过程
代码
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums)
{
int n=nums.size();
vector<vector<int>> res;
arange(res,nums,0,n-1);
return res;
}
void arange(vector<vector<int>> &res,vector<int> &nums,int left,int right)
{
if(left==right)
{
res.push_back(nums);
return;
}
for(int i=left;i<=right;i++)
{
swap(nums[i],nums[left]);
arange(res,nums,left+1,right);
swap(nums[i],nums[left]);
}
}
};