分享一道奇妙的力扣题---下一个排列

31. 下一个排列 - 力扣(LeetCode)

分享一道奇妙的力扣题---下一个排列_第1张图片

 我们要做的就是让左边一个较小的数与右边一个较大的数进行交换,而且,要让 ”较小的数尽可能靠近右边,而较大的数尽可能的小“

而且再交换之后,要让i到n-1上的数字从小到大,这一点很重要,只有这样才能保证变大的幅度最小

 越靠右的话改变的位置越小,十位的变动肯定比百位,千位引起的变化小的多

改变的时候,肯定是想又能变大,又尽可能的变大的比较少

有了这些基础我们就可以来写这道题了:

我们先从后向前,去找第一个出现nums[ i-1 ] < nums[ i ] 的情况,那么在i到n-1的区间上,肯定是降序的,因为都不满足前面的条件嘛,所以说我们可以从后面的区间   i 到 n-1上 从后向前去找到到第一个元素j,满足nums[ i-1 ]  < nums[ j ],然后交换这两个数的值

交换之后这个这个区间也还是降序的,我们只需要翻转reverse一下就能得到升序,这个复杂度也是O(n),如果用sort的话复杂度是O(nlogn)。外面一次遍历是O(n),内部一次翻转,这两个是并列的,相当于最多进行两次遍历,也就是2 * O(n),也就是说时间复杂度能够达到O(n),实在是妙哉!

//两次扫描
    void nextPermutation(vector& nums) {
        int n=nums.size();
        for(int i=n-1;i>0;--i){
            if(nums[i-1]=i;--j){
                    if(nums[i-1]

当我们用sort的时候:

分享一道奇妙的力扣题---下一个排列_第2张图片

而我们用了reverse的话:

 分享一道奇妙的力扣题---下一个排列_第3张图片

 可以看到,reverse是真的秒啊

你可能感兴趣的:(刷题日志,leetcode,算法,职场和发展)