Leetcode31 下一个排列
一、问题描述
二、解题思路
采用找、换、翻3步骤来解决这个问题:
<1>找:从右向左找到第一个可以增大的位置i,即最小的可以增大的位置;
<2>换:将该位置的数与[i+1,nums.size()-1]区间最小的但大于其的数交换;
<3>翻:将[i+1,nums.size()-1]区间翻转,由于该集合为降序,所以进行逆转,保证增幅最小。
三、代码实现
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()); } };