题目考察的知识点

考察数组的操作,对于题目的理解

题目解答方法的文字分析

难点在于分析题目,其实对于最小的下一个排序,需要的是从后往前寻找,找到第一个前面数大于后面数的组合,将其颠倒位置之后,这个数就会比之前的排列更大,但题目要求的是紧邻的下一个排序,所以需要再将这一段到最后的排序变为一段升序序列就可以满足下一个的最小排序了。

本题解析所用的编程语言

使用Java语言解答

完整且正确的编程代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param cows int整型一维数组
     * @return int整型一维数组
     */
    public int[] nextPermutation (int[] cows) {
        // write code here
        int size = cows.length;
        int i = size - 2;
        while (i >= 0 && cows[i] <= cows[i + 1]) i--;
        if (i >= 0) {
            int j = size - 1;
            while (j >= 0 && cows[i] <= cows[j]) j--;
            swap(cows,i,j);
        }
        reverse(cows, i + 1, size-1);
        return cows;
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    private void reverse(int[] nums, int start, int end) {
        while (start < end) {
            // 交换 start 和 end 处的元素
            swap(nums, start, end);
            start++;
            end--;
        }
    }
}