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 反转,使它变成最小的排列,也就是升序的。

京公网安备 11010502036488号