题目
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
思路
代码
class Solution {
public:
// 辅助函数,用于生成全排列
void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len) {
// 如果所有位置都已填满,将当前排列加入结果集中
if (first == len) {
res.emplace_back(output);
return;
}
// 在当前的位置上尝试所有可能的数字
for (int i = first; i < len; ++i) {
// 交换当前数字到当前位置
swap(output[first], output[i]);
// 递归填充下一个位置
backtrack(res, output, first + 1, len);
// 回溯,撤销操作
swap(output[first], output[i]);
}
}
// 主函数,返回所有可能的全排列
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
// 从第一个位置开始生成全排列
backtrack(res, nums, 0, nums.size());
return res;
}
};
心得
1.交换完成,当前位置first=数组末尾,将当前排列加入结果集中
2.回溯,swap两次
3.递归,深度优先搜索DFS,不断深入下一层,直到交换完成触发return,
4.栈,递归,深度优先搜索:都是先入后出(后入先出)