import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param cows int整型一维数组
     * @return int整型一维数组
     */
   public int[] nextPermutation (int[] cows) {
        // 找到第一个降序的位置,从右往左
        int index = cows.length-2;
        while (index>=0 && cows[index]<=cows[index+1]){
            index--;
        }

        //如果找到了,说明不是最大的排列,需要交换
        if(index>=0) {
            //找到右边比cows[index]大的最小的数,从右往左
            int j = cows.length - 1;
            while (j > index && cows[j] > cows[index]) {
                j--;
            }
            // 交换cows[i]和cows[j]
            swap(cows,index,j);
        }
        // 反正cows[i+1]到cows[length-1]之间的元素,使其升序
        reverse(cows,index+1,cows.length-1);
        return cows;
    }

    public void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public void reverse(int[] cows,int start,int end){
        while (start<end){
            swap(cows,start,end);
            start++;
            end--;
        }
    }
}

本题考察的知识点是数组元素交换,所用编程语言是java。

这个问题可以分为以下几个步骤:

1.从右往左找到第一个升序的位置 i ,即 cows[i] > cows[i+1] 。这个位置 i 之后的元素都是升序的,所以它们已经是最小的排列,不能再变小了。

2.如果 i 存在,说明数组 cows 不是最小的排列,还有可能变小。那么我们需要在 i 之后的元素中找到一个比 cows[i] 小的最小的数 j ,即 cows[j] <cows[i] ,并且 j 是满足这个条件的最右边的位置。这样,我们把 cows[i] 和 cows[j] 交换,就可以让数组 cows 变得更小一点。

3.交换后,i 之后的元素仍然是升序的,但是我们想要找到下一个排列,也就是比当前排列稍微小一点的排列。所以我们需要把 i 之后的元素反转,使它们变成降序的,这样就可以得到下一个排列了。

4.如果 i 不存在,说明数组 cows 已经是最大的排列,没有下一个排列了。那么我们需要把数组 cows 反转,使它变成最小的排列,也就是升序的。