LeetCode-46. 全排列
1、题目描述:
给定一个不含重复数字的数组 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
中的所有整数 互不相同
2、代码:
#include <algorithm>
#include <vector>
using namespace std;class Solution
{
public:vector<vector<int>> permute(vector<int>& nums){vector<vector<int>> result;backtrack(nums, 0, result);return result;}void backtrack(vector<int>& nums, int start, vector<vector<int>>& result){if (start == nums.size()) {// 找到一个排列,加入结果result.push_back(nums);return;}for (int i = start; i < nums.size(); ++i) {swap(nums[start], nums[i]);backtrack(nums, start + 1, result);swap(nums[start], nums[i]);}}
};
3、解题思路:
全排列问题要求生成所有可能的元素排列。回溯法是一种有效的解决方法,其核心思想是通过递归和回溯来探索所有可能的路径。具体步骤如下:
- 选择路径:从第一个位置开始,依次将每个位置的元素与当前位置交换,固定当前元素。
- 递归探索:对剩余未固定的元素递归执行相同操作,直到所有元素都被固定。
- 回溯恢复:递归返回后,撤销之前的交换操作,恢复原状,以便进行下一次选择。
4、代码解释
- 主函数
permute
:初始化结果容器并调用回溯函数。 - 回溯函数
backtrack
:- 终止条件:当
start
等于数组长度时,表示所有元素已固定,当前数组为一个排列,加入结果。 - 循环遍历:从
start
开始,将每个元素交换到当前位置。 - 递归调用:处理下一个位置,即
start + 1
。 - 回溯恢复:撤销交换操作,确保后续循环的正确性。
- 终止条件:当