题目:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路1:
用algorithm里面的“next_permutation”函数可以直接求解。这个函数会求出该字符串或者数组的下一个全排列。但是首先要对数组进行升序排列。
代码:
class Solution
{
public:
vector<vector<int>>permute(vector<int>&nums)
{
vector<vector<int>>result;
sort(nums.begin(), nums.end());
do {
result.push_back(nums);
} while (next_permutation(nums.begin(), nums.end()));
return result;
}
};
思路2:
回溯法是比较经典的做法,这里有一篇文章讲的很清楚。
https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-xiang-jie-by-labuladong-2/
模板就是:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
代码:
class Solution
{
private:
vector<int>path;
vector<vector<int>>result;
unsigned long n_size;
public:
void backtrack(vector<int>nums)
{
if (path.size()==n_size)
{
result.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++)
{
path.push_back(nums[i]);
vector<int>temp = nums;
temp.erase(temp.begin() + i);
backtrack(temp);
path.pop_back();
}
}
vector<vector<int>>permute(vector<int>& nums)
{
this->n_size = nums.size();
backtrack(nums);
return result;
}
};