2017.9.22
首先 ,初始排列一定是递增的。排列就是然后不断将最大值慢慢向前移动的过程。也可以理解为讲一个升序的数组慢慢变成一个降序数组的样子。
假如 ,给定一个排列为 1,5,7,6,2,1。 从后往前看,[7,6,2,1]一直是降序的情况,直到在5这里出现了不同。
这个时候,可以这样理解,就是固定了 首位 15之后,剩下数字做完了所有的排列,这个时候,需要做的是从后边的数字里边找到一个比5大的最小值,替换到5作为最高位,然后剩下的数字重新开始进行排列。
所以算法可以这样总结,
先从右向左找到nums[flag] < nums[flag+1]
然后再从右向左找到nums[i] > nums[flag];nums[i] ,nums[flag]交换位置之后,nums[flag]之后的数重新排序为初始排列。这样说,大概我自己可以明白了。
public class Solution {
/*
* @param nums: A list of integers
* @return: A list of integers
*/
public int[] nextPermutation(int[] nums) {
// write your code here
int length = nums.length;
if(length <= 1){
return nums;
}
int flag = length -2;
while(flag >= 0){
if(nums[flag] < nums[flag+1]){
break;
}
flag--;
}
if(flag == -1){
Arrays.sort(nums);
return nums;
}
int i = length - 1;
while(i > 0){
if(nums[i] > nums[flag]){
int tmp = nums[flag];
nums[flag] = nums[i];
nums[i] = tmp;
break;
}
i--;
}
int []res = new int[length - flag];
res = Arrays.copyOfRange(nums, flag+1, length);
Arrays.sort(res);
for(int m = flag + 1 ; m < length; m++){
nums[m] = res[m-1-flag];
}
return nums;
}
}