力扣-31.下一个排列

题目链接

31.下一个排列

java 复制代码
class Solution {
    public void nextPermutation(int[] nums) {
        //1.从右往左找第一个非逆序的数a
        int left = nums.length - 2;	//这里是为了找不到顺序对的时候正好停在-1
        while (left >= 0 && nums[left] >= nums[left + 1]) {	//一定要取等号,因为相等要继续寻找
            left--;
        }
        //2.从右往左找到第一个大于a的数b
        if (left >= 0) {
            int right = nums.length - 1;
            while (right > left && nums[right] <= nums[left]) {	//取等号
                right--;
            }
            //3.交换a,b
            swap(nums, left, right);
        }
        //4.将a后面的数逆序
        reverse(nums, left + 1);
    }

    public void swap(int[] nums, int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }

    public void reverse(int[] nums, int begin) {
        int end = nums.length - 1;
        while (begin < end) {
            swap(nums, begin, end);
            begin++;
            end--;
        }
    }
}

小结:如果在步骤 1 找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤 2、3 执行步骤 4,即可得到最小的升序序列。

相关推荐
Neil今天也要学习9 小时前
永磁同步电机无速度算法--基于相位超前校正的LESO
算法·1024程序员节
码农多耕地呗10 小时前
力扣226.翻转二叉树(java)
算法·leetcode·职场和发展
IT古董11 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(3)理解粗排模型之在线部分:在线架构及对双塔的应用
算法·1024程序员节
大数据张老师11 小时前
数据结构——平衡二叉树
数据结构·算法·查找
py有趣12 小时前
LeetCode算法学习之合并区间
学习·算法·leetcode
m0_7482336412 小时前
单调栈详解【C/C++】
c语言·c++·算法·1024程序员节
郝学胜-神的一滴12 小时前
Linux中的`fork`函数详解:深入解析
linux·服务器·开发语言·c++·算法
大数据张老师13 小时前
数据结构——BF算法
数据结构·算法·1024程序员节
让我们一起加油好吗13 小时前
【数论】欧拉定理 && 扩展欧拉定理
c++·算法·数论·1024程序员节·欧拉定理·欧拉降幂·扩展欧拉定理
一匹电信狗13 小时前
【LeetCode_876_2.02】快慢指针在链表中的简单应用
c语言·数据结构·c++·算法·leetcode·链表·stl