题目
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路
代码
#include <iostream>
#include <vector>
using namespace std;
class Solution_wu {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> sets;//输出答案:最终生成的所有子集
vector<int> path;//每次递归后生成的一个答案子集
vector<bool> used(nums.size(), false);//递归访问时正在访问的数组元素是否之前被访问过
backtrack(nums, path, used, sets);
return sets;
}
private:
void backtrack(vector<int>& nums, vector<int>& path, vector<bool>& used, vector<vector<int>>& sets) {
if (path.size() == nums.size()) {//递归终止条件
sets.push_back(path);//确定好一个子集,把他加入到答案集合中
return;
}
for (int i = 0; i < nums.size(); i++) {
if (!used[i]) {
path.push_back(nums[i]);//把本次递归访问的元素加入到数组
used[i] = true;
backtrack(nums, path, used, sets);//递归
used[i] = false;//取消对nums[i]的选择
path.pop_back();//移除该元素,该层递归完后,path为空
}
}
}
};
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[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;
}
};
int main() {
Solution_wu a;
vector<vector<int>> results;
int num;
vector<int> nums;
while (cin >> num) {
nums.push_back(num);
}
results = a.permute(nums);
for (int i = 0; i < results.size(); i++) {
for (int j = 0; j < results[i].size(); j++) {
cout << results[i][j] << " ";
}
cout << endl;
}
}