题目:
分析:
先看一个例子,
8,5,3,7,6,5,4,1下一个排列应该是:
8,5,4,1,3,5,6,7
看起来应该是从后往前找,找到第一个降序的数字,因为如果一直都是升序的话,说明一部分以及是全排列的最大情况。第一个比它后一个数小的数,就是需要替换为比它大一点的那个数,即3。
找到3以后,需要把它替换成一个比它大一点的数,于是再从后往前找,找到第一个比它大的数,在上面的例子,就是4.
将3和4交换,由于后半部分已经是最大的全排列,逆序一下得到最小的全排列。
若数组本身就是最大全排列,直接逆序整个数组即可。
若数组长度小于1,则直接返回即可。
public class Solution { /** * @param nums: An array of integers * @return: nothing */ public void nextPermutation(int[] nums) { // write your code here int len=nums.length; if(len==0) return; int temp=nums[len-1]; int need=len-1; for(int i=len-2;i>=0;i--){ if(nums[i]>=temp){ temp=nums[i]; continue; }else{ need=i; break; } } if(need==len-1){ //当前就是最大的整数,直接逆序 reverse(nums,0,nums.length-1); }else{ for(int i=len-1;i>need;i--){ if(nums[i]>nums[need]){ //从右往左找到第一个大于need下标的数,然后交换 int o=nums[need]; nums[need]=nums[i]; nums[i]=o; break; } } reverse(nums,need+1,nums.length-1); } } public void reverse(int[] nums,int start,int end){ while(start<end){ int temp=nums[start]; nums[start]=nums[end]; nums[end]=temp; start++; end--; } } }