LeetCode模板题
补充一、排列
方法一、(常规)dfs + 回溯
Ps:
回溯一定要注意的是
恢复现场
利用 递归搜索树 求解
#include<iostream>
using namespace std;
const int N = 10;
int n ;
bool st[N]={0};//储存状态
int nums[N]={0};//储存数据
void dfs(int cnt)
{
if(cnt > n)
{
for(int i = 1 ;i <= n; i ++ ) cout <<nums[i]<<' ';
cout << endl;
}
else
{
for(int i = 1; i <= n ; i ++ )
{
if(!st[i])//依次找到没有使用过的数
{
st[i] = 1;
nums[cnt] = i;
dfs(cnt + 1);
st[i] = 0;//恢复场景
}
}
}
}
int main()
{
cin >> n;
dfs(1);
return 0;
}
补充二、(STL)next_permutation
[点击跳转->next_permutation详解]
由上文我们可知 next_permutation 函数可以对 ret 数组进行指定操作
得到目前数字 的 下一个 字典序yyds
(https://blog.csdn.net/GuLeng______/article/details/122953769?spm=1001.2014.3001.5502)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n; cin >>n;
vector<int> ret ;
for(int i = 1;i <= n ; i ++) ret.push_back(i);//读入 1 ~ n
do
{
for(int i = 0;i < n ; i ++) cout<<ret[i]<<' ';
cout<<endl;
}while(next_permutation(ret.begin(), ret.end()));
//**因为该函数在本身是最大字典序的时候会返回fasle**
return 0;
}
例题二、数字排列
话不多说直接上
STL
class Solution {
public:
vector<vector<int>> permutation(vector<int>& nums)
{
sort(nums.begin(), nums. end());
vector<vector<int>>ret ;//定义一个存放 数组的 数组 所以10行才可以 push_back 数组
do
{
ret.push_back(nums);//将原数组 放入vector
}while(next_permutation(nums.begin(),nums.end()));
return ret;
}
};