给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入:
[1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
vector<bool> vst;
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
vst = vector<bool>(n);
dfs(0, nums);
return res;
}
void dfs(int u, vector<int>& nums) {
if(u == nums.size()) {
res.push_back(path);
return ;
}
for(int i = 0; i < nums.size(); i++) {
if(!vst[i]) {
vst[i] = true;
path.push_back(nums[i]);
dfs(u+1, nums);
vst[i] = false;
path.pop_back();
}
}
}
};
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<iostream>
using namespace std;
const int N = 10;
int path[N];
bool vst[N];
int n;
void dfs(int u) {
if(u == n) {
for(int i = 0; i < n; i++) printf("%d ", path[i]);
puts("");
return;
}
for(int i = 1; i <= n; i++) {
if(!vst[i]) {
path[u] = i;
vst[i] = true;
dfs(u+1);
vst[i] = false;
}
}
}
int main() {
cin >> n;
dfs(0);
return 0;
}
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
vector<bool> vst;
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
path = vector<int>(n);
vst = vector<bool>(n);
sort(nums.begin(), nums.end());
dfs(0, nums);
return res;
}
void dfs(int u, vector<int>& nums) {
if(u == nums.size()) {
res.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++) {
if(!vst[i]) {
if(i && nums[i-1] == nums[i] && vst[i-1]) continue;
path[u] = nums[i];
vst[i] = true;
dfs(u+1, nums);
vst[i] = false;
}
}
}
};