给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
搜索回溯的思想
//求出数组中所有可能的排列
class Solution {
public:
void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
// 所有数都填完了
if (first == len) {
res.emplace_back(output);
return;
}
//循环递归,i=0时递归完毕后,将之前交换后的元素还原,再进行i=1时的递归
for (int i = first; i < len; ++i) {
// 动态维护数组
swap(output[i], output[first]);
// 继续递归填下一个数
backtrack(res, output, first + 1, len);
// 撤销操作
swap(output[i], output[first]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;
//回溯
backtrack(res, nums, 0, (int)nums.size());
return res;
}
};
代码中用for循环递归,i=0时递归完毕后,将之前交换后的元素还原,再进行i=1时的递归。交换元素是为了区别哪些元素已经被选取过了,这递归完成再将元素交换回去。
力扣有个图解的搜索过程展现的很详细,大家可以去看一下
参考地址:https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode-solution-2/