https://leetcode-cn.com/problems/next-permutation/submissions/
算法介绍见 微信 程序员小灰
。。
挺坑的
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
void nextPermutation(vector<int>& nums) {
// vector<int>ans;
int len = nums.size();
if(len<2)return; //防止只有一个数
int j = len-1;
while(j>=1&&nums[j-1]>=nums[j])j--; // 注意加上等于号,5 1 1情况
int i = len-1;
if(j>0) //不加会出现nums[-1]
while(nums[i]<=nums[j-1]&&i>j)i--; // 注意,i>j,加上等于号
// cout<<"j: "<<j-1<<endl;
// cout<<"i: "<<i<<endl;
if(j==0){
sort(nums.begin(),nums.end());
return;
// return nums;
}
else if(i>=0&&j>=1){
swap(nums[i],nums[j-1]);
sort(nums.begin()+j,nums.end());
//return nums;
}
}
};
int main(){
Solution ss;
int n;
cin>>n;
vector<int>nums;
for(int i=1;i<=n;i++){
int num;
cin>>num;
nums.push_back(num);
}
ss.nextPermutation(nums);
for(int p:nums){
cout<<p<<" ";
}
}
//#include <iostream>
//#include<bits/stdc++.h>
//using namespace std;
//int board[500];
//const long long inf = 1e18;
//long long getsum(){
// long long ans =0;
// ans+=board[0]*board[1]*board[2]*board[3];
// ans+=board[4]*board[5]*board[10]*board[11];
// ans+=board[8]*board[9]*board[14]*board[15];
// ans+=board[6]*board[7]*board[12]*board[13];
// ans+=board[16]*board[17]*board[18]*board[19];
// ans+=board[20]*board[21]*board[22]*board[23];
//// ans+=board[12]*board[13]*board[14]*board[15];
//
// return ans;
//}
//void Swap(int a,int b,int c){
//// s
//}
//void Right(){
//
//}
//void Left(){
//}
//void Up(){
//}
//void Down(){
//}
//void Behind(){
//
//}
//void Front(){
//
//}
//int Ans = 0;
//void DFS(int ){
//
// long long sum = getsum();
// if(sum>Ans){
//
// }
// if(tp==5)return ;
//
//}
//int main()
//{
//
// for(int i=0;i<24;i++)
// scanf("%d",&board[i]);
//
// return 0;
//}