回溯算法的框架
def backtrack(...):
for 选择 in 选择列表:
做选择
backtrack(...)
撤销选择
题目描述
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
结果
这道题一看就是一道【树】的题,直接DFS深度优先遍历,直接用了回溯法
这道题没有按照字典顺序输出,下一个解法就解决了字典输出问题
void backtrack(vector<vector<int>>& res, vector<int>& nums, int position, int len)
{
if(position == len)
{
res.emplace_back(nums); // 和push_back()一样的结果
return;
}
for(int i = position; i < len; i++)
{
swap(nums[position], nums[i]);
backtrack(res, nums, position+1, len);
swap(nums[position], nums[i]);
}
}
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
backtrack(res, nums, 0, (int)nums.size());
return res;
}
};
解法二:直接用std的函数接口
用了std的next_permutation()函数,此函数就是输出题目所要求的全排列
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
sort(begin(nums), end(nums));
vector<vector<int>> res;
do{
res.emplace_back(nums);
}while(next_permutation(nums.begin(), nums.end()));
return res;
}
};