31.下一个排列
详细思路见图
void nextPermutation(vector<int>& nums) {
// 难点: 如何得到下一个符合要求的排列
// 思路如下: 需要从后往前找到第一个 i-1 < i的存在,然后再从后往前找到首个大于i-1进行交换, 再把i到end倒序
int flag = false;
for(int i = nums.size() - 1; i > 0; i--)
{
if(nums[i-1] < nums[i])
{
int index = i - 1; // 保存第一个符合条件的元素的下标
for(int j = nums.size() - 1; j > index; j--)
{
if(nums[j] > nums[index]) // 找到首个大于index的元素,也就是最小的元素,也就是官方题解中最靠右的元素
{
swap(nums[j],nums[index]);
// 最后反转index + 1 到最后的所有元素,以满足下一个排列的要求
reverse(nums.begin() + index + 1, nums.end());
flag = true; // 用flag处理最大值的下一个排列是最小值的特殊情况
break;
}
}
break;
}
}
if(!flag) reverse(nums.begin(), nums.end()); // 最大值反转就是最小值
}