leetcode 31

90 阅读1分钟

31.下一个排列

详细思路见图

image.png

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()); // 最大值反转就是最小值
    
    }