一共三种方法:1.系统函数法 2.递归法 3.非递归,由已知排列找下一个全排列法
1.系统函数法
#include <algorithm>
vector<vector<int> >res;
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
sort(num.begin(), num.end());
do {
res.push_back(num);
}while (next_permutation(num.begin(), num.end()));
return res;
}
};
2.递归法
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 10;
vector<int> temp;
vector<vector<int> > res;
bool visit[MAXN];
class Solution {
public:
void dfs(int index, vector<int>& num) {
if (index == num.size()) {
res.push_back(temp);
} else {
for (int i = 0; i < num.size(); ++i) {
if (visit[i]) {
continue;
} else {
visit[i] = true;
temp.push_back(num[i]);
dfs( index + 1, num);
visit[i] = false;
temp.pop_back();
}
}
}
}
vector<vector<int> > permute(vector<int>& num) {
sort(num.begin(), num.end());
dfs(0, num);
return res;
}
};
3.非递归,由已知排列找下一个全排列法
#include <algorithm>
#include <any>
#include "vector"
using namespace std;
vector<vector<int> >res;
class Solution {
public:
bool GetNextPermutation(vector<int>& num) {
int n = num.size();
int index = n - 1;
while (index >= 1 && num[index] < num[index - 1]) {
index--;
}
index--;
if (index < 0)return false;
for (int i = n - 1; i > index; --i) {
if (num[index] < num[i]) {
swap(num[index], num[i]);
break;
}
}
reverse(num.begin() + index + 1, num.end());
return true;
}
vector<vector<int> > permute(vector<int>& num) {
sort(num.begin(), num.end());
do {
res.push_back(num);
} while (GetNextPermutation(num));
return res;
}
};

京公网安备 11010502036488号