一共三种方法: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; } };