题干的意思是:找出这个数组排序出的所有数中,刚好比当前数大的那个数
比如当前 nums = [1,2,3]。这个数是123,找出1,2,3这3个数字排序可能的所有数,排序后,比123大的那个数 也就是132
如果当前 nums = [3,2,1]。这就是1,2,3所有排序中最大的那个数,那么就返回1,2,3排序后所有数中最小的那个,也就是1,2,3 -> [1,2,3]
解题思路就是:
从最后倒着找,也就是尽量交换低位数字。
首先找最后两位nums[len-2],nums[len-1],如果为正序对(升序),则找到,交换两个的值;反之,则找最后三位…找到第n位的时候,只要判断它和第n+1位的大小关系(n+1往后是降序),如果两者仍为逆序,继续向前,反之说明nums[n]<nums[n-1],这个时候,只要找到后面的数字中刚好大于nums[n]的数字nums[j],交换两者即可;
如果从后一直遍历到第一个数字,都是逆序(降序)的,那么则找不到下一个更大的数,将数组反转即可。
逆序对的意思:下标i>j,但是nums[i]<nums[j]
class Solution {
public void nextPermutation(int[] nums) {
int i=nums.length-2,j=nums.length-1;
int temp =0;
boolean flag=false;
while(i>=0&&!flag){
if(nums[i]>=nums[i+1]){
i--;
}else{
while(true){
if(nums[i]<nums[j]){
temp=nums[j];
nums[j]=nums[i];
nums[i]=temp;
//在这里再加上i之后从最后面两两交换,为了吃饭就不写
flag=true;
break;
}else j--;
}
}
}
if(!flag){
Arrays.sort(nums);
}
}
}
代码出现一个遗漏:对于1,3, 2,这里输出结果为2,3,1,但是实际应该是2,1,3. 已经想到会不会出现交换多次的情况,但是以为不会。
然后从评论中找到了方法:
然后交换a[i-1]与a[k],然后对[i, ∞]排序即可,排序只需要首尾不停交换即可,因为已经是降序 上面说的很抽象,还是需要拿一些例子思考才行,比如[0,5,4,3,2,1],下一个是[1,0,2,3,4,5]
代码写在注释那个位置,吃饭先