题意寻找比当前排列顺序大的下一个排列。
因为降序序列是没法变的更大的,所以从后往前找到第一个升序对的位置。
然后就存在调整大小排列顺序的可能,从后往前找到比当前位置大的元素,交换之。
当前位置后面的元素还是降序排列,将他们反转得到最小顺序排列。其实就是原来当前位置元素后面是最大的排列,而交换后的新元素之后是最小的排列,他们就是相邻的顺序。
当不存在升序,则当前排列是最大排列,只要旋转整个序列变成最小排列。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.size()<=1)
return;
int index1=-1;
// 找到最后一个升序位置index1
for(int i=nums.size()-1;i>0;i--)
{
if(nums[i-1]<nums[i])
{
index1=i-1;
break;
}
}
//2.如果不存在升序,即这个数是最大的,那么反排这个数组
if(index1<0)
{
reverse(nums.begin(),nums.end());
return;
}
//3.存在升序,那么找到index之后最后一个比它大的位置
for(int i=nums.size()-1;i>index1;i--)
{
if(nums[i]>nums[index1])
{
swap(nums[index1],nums[i]);
break;
}
}
//4.反排index1之后的数
reverse(nums.begin()+index1+1,nums.end());
}
};