解题思路:

为了实现找到一个更大的排列

1、首先i从数组end位置向start位置遍历 找到nums[i]>nums[I-1] 跳出循环

2、如果i==0,还没有跳出循环,说明数组本身是按照降序排序,此时应该输出升序,(升序可以使用双指针法完成)

3、如果在i!=0时能够找到nums[i]>nums[i-1],让j从i的位置向后找比nums[i-1]大的元素,并与其进行交换

4、从i+1开始对后面的数进行快速排序,直至循环结束

 

源码:

class Solution {
public:
    //构建一个快速排序函数
    void quick(vector<int>& a,int start,int end)
    {
        if(start>=end) return;
        int i=start;
        int j=end;
        int temp=a[i];
        while(i<j)
        {
            while(i<j && a[j]>=temp) j--;
            while(i<j && a[i]<=temp) i++;
            swap(a[i],a[j]);
        }
        swap(a[i],a[start]);
        quick(a,start,i-1);
        quick(a,i+1,end);
    }

    
    void nextPermutation(vector<int>& nums) {
        int N=nums.size();
        int i=N-1;//i是从后向前遍历
        //遍历找到nums[i]>num[i-1]  
        while(i>0)
        {
            if(nums[i]<=nums[i-1]) i--;
            else break;
        }
        //i==0,说明是按照降序排列,应该输出升序,这里使用双指针快速完成升序
        if(i==0)
        {
            int p=0;
            int q=N-1;
            while(p<=q) swap(nums[p++],nums[q--]);
            return;
        }
        int j=i;
        int select=nums[i-1];
        while(nums[j]>=select)
        {
            j++;
            if(j==N) break;
        }
        while(nums[j-1]==select) j--;
        swap(nums[i-1],nums[j-1]);
        quick(nums,i,N-1);
    }
};