题目
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路
可以使用回溯算法来解决这个问题。具体的思路如下:
- 定义一个结果集 res,用来存储所有可能的全排列。
- 定义一个空的排列 perm,用来存储当前正在生成的排列。
- 定义一个标记数组 visited,用来标记某个数字是否已经被使用过。
- 使用回溯算法生成所有可能的全排列。
- 如果 perm 中的数字数量等于 nums 数组的长度,说明已经生成了一个完整 的排列,将其加入到 res 中。
- 否则,遍历 nums 数组中的每个数字,如果该数字没有被使用过,则将其加 入到 perm 中,然后递归调用生成下一个位置的数字,之后将该数字从 perm 中移除,继续生成下一个数字。
- 返回结果集 res。
Code
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> perm;
vector<bool> visited(nums.size(), false);
backtrack(nums, visited, perm, res);
return res;
}
private:
void backtrack(vector<int>& nums, vector<bool>& visited, vector<int>& perm, vector<vector<int>>& res) {
if (perm.size() == nums.size()) {
res.push_back(perm);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (!visited[i]) {
visited[i] = true;
perm.push_back(nums[i]);
backtrack(nums, visited, perm, res);
perm.pop_back();
visited[i] = false;
}
}
}
};
附加
也有第二种方法就是使用C++标准库中的全排列函数 next_permutation
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end()); // 首先对数组进行排序
do {
res.push_back(nums);
} while (next_permutation(nums.begin(), nums.end())); // 不断生成下一个排列直到最后一个排列
return res;
}
};