下一个排列(c++)

  1. 题目:
    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
2. 解题思路:我是按照leetcode官方的解题方法进行解的,自己尝试了几个解法都没ac就放弃了。官方的解题方法我觉得非常巧妙,从后往前找到nums中第一个比它后一个大的数,那么它的后一个数就是要被交换的,然后再从后往前找第一个比nums[i-1] 大的数与之交换,然后对nums[i]到nums.end()的数进行逆序(可以直接逆序的原因是这些数一定是从右至左递增的)就得到了下一个排列。
3. 解题代码:


class Solution {
    
    
public:
    void nextPermutation(vector<int>& nums) {
    
    
        //首先从后往前找到第一个nums[i] > nums[i-1]的数
        //然后从i - nums.size() 中找到比nums[i+1]大 且 大的最少的数与之交换,然后对i - nums.size()-1 的范围由小到大排序
        int i = nums.size() - 2;
        while (i >= 0 && nums[i] >= nums[i + 1]) {
    
    
            i--;
        }
        if (i >= 0) {
    
    
            int j = nums.size() - 1;
            while (j >= 0 && nums[i] >= nums[j]) {
    
    
                j--;
            }
            swap(nums[i], nums[j]);
        }
        reverse(nums.begin() + i + 1, nums.end());
    }
};
  1. tips:
    reverse()函数是c++中新增的函数,作用是对vector中的方法进行反向的排序。

Guess you like

Origin blog.csdn.net/qq_43964318/article/details/120624064