题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:
(一)内置函数next_permutation
代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
res.push_back(nums);
while (next_permutation(nums.begin(), nums.end()))
res.push_back(nums);
return res;
}
};
(二)回溯算法
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为: 1、定义一个解空间,它包含问题的解。 2、利用适于搜索的方法组织解空间。 3、利用深度优先法搜索解空间。 4、利用限界函数避免移动到不可能产生解的子空间。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
pmt(nums, 0, res);
return res;
}
void pmt(vector<int> &seq, int idx, vector<vector<int>> &res)
{
if(idx == seq.size() - 1)
res.push_back(seq);
else
{
for(int i = idx; i < seq.size(); i++)
{
swap(seq[idx], seq[i]);
pmt(seq, idx + 1, res);
swap(seq[i], seq[idx]);
}
}
}
};
结果: