【重点】【特例】31.下一个排列

2023-12-27 22:52:34

题目

法1:找规律

在这里插入图片描述
在这里插入图片描述

class Solution {
    public void nextPermutation(int[] nums) {
        int small = -1, big = -1;
        for (int i = nums.length - 2; i >= 0; --i) {
            if (nums[i] < nums[i + 1]) {
                small = i;
                break;
            }
        }
        if (small == -1) {
            reverse(0, nums.length - 1, nums);
        } else {
            big = small + 1;
            for (int i = big; i < nums.length; ++i) {
                if (nums[i] > nums[small]) {
                    if (nums[i] <= nums[big]) { // 注意这里需要有"=", 保证small位后面的数字是降序排列
                        big = i;
                    }
                }
            }
            swap(small, big, nums);
            reverse(small + 1, nums.length - 1, nums);
        }
    }

    public void reverse(int i, int j, int[] nums) {
        while (i < j) {
            swap(i, j, nums);
            ++i;
            --j;
        }
    }

    public void swap(int i, int j, int[] nums) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

文章来源:https://blog.csdn.net/Allenlzcoder/article/details/135252930
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。