一、问题描述


二、解题思路
采用找、换、翻3步骤来解决这个问题:
<1>找:从右向左找到第一个可以增大的位置i,即最小的可以增大的位置;
<2>换:将该位置的数与i+1,nums.size()-1区间最小的但大于其的数交换;
<3>翻:将i+1,nums.size()-1区间翻转,由于该集合为降序,所以进行逆转,保证增幅最小。
三、代码实现
cpp
class Solution {
public:
void nextPermutation(vector<int>& nums) {
//找增幅最小的排列
int n=nums.size();
//1.找:从右向左找到第一个可以增大的位置i
int i=n-2;
while(i>=0&&nums[i]>=nums[i+1]) i--;
//2.换:将该位置的数与[i+1,nums.size()-1]区间最小的大于其的数交换
int j=n-1;
if(i>=0){
while(j>i&&nums[j]<=nums[i]) j--;
swap(nums[i],nums[j]);
}
//3.翻:将[i+1,nums.size()-1]区间翻转
reverse(nums.begin()+i+1,nums.end());
}
};