import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param cows int整型一维数组
     * @return int整型一维数组
     */
    public int[] nextPermutation(int[] cows) {
        // 初始化指针 i,指向倒数第二个元素
        int i = cows.length - 2;

        // 找到从右往左第一个不满足递增条件的元素索引 i
        while (i >= 0 && cows[i] <= cows[i + 1]) {
            i--;
        }

        // 如果存在满足递增条件的元素
        if (i >= 0) {
            // 找到从右往左第一个大于元素 cows[i] 的元素索引 j
            int j = cows.length - 1;
            while (j >= 0 && cows[i] <= cows[j]) {
                j--;
            }

            // 交换元素 cows[i] 和 cows[j]
            swap(cows, i, j);
        }

        // 对剩余部分进行反转,使其成为最小的字典序
        reverse(cows, i + 1, cows.length - 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--;
        }
    }
}

本题知识点分析:

1.数组遍历

2.数学模拟

3.字符串的翻转类似

本题解题思路分析:

1.找到从右往左第一个不满足递增条件的元素索引 i

2.如果存在满足递增条件的元素

3.找到从右往左第一个大于元素 cows[i] 的元素索引 j

4.进行元素交换

5.对剩余部分进行翻转,变成最小的字典序

本题使用编程语言: Java