NextPermutation题目描述:为了实现获取下一个排列的功能,算法需要将给定的数列按照字典顺序重新排列成下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列为最小的排列(即升序)。必须就地修改,只允许额外的常量空间。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:遍历数组首先,如果数组为空或者只有一个元素,直接返回;声明一个变量handled表示是否找到更大的排列,默认为false,left和right分别记录需要交换的数来寻找更大的排列,然后对数组进行double-loop判断是否有更大的排列排列。具体遍历过程如下:从数组的最后一位开始遍历。handled更新为true,然后遍历下一位;在遍历过程中,需要判断是否找到了满足条件的数,是否比之前得到的情况好,如果好,则更新左右。然后根据handled的判断,如果为false,说明没有更大的排列,也就是没有下一个更大的排列,把数字重新排列成最小的排列就是倒序;如果为真,则需要进行以下处理:首先,交换左右位置的数字;然后将后面的数取反right+1,这一步是将后面的数排成最小值;然后把left+1到right-1之间的数和right+1到nums.length-1之间的数的顺序作为一个整体交换。这一步也是将后面剩下的数排成最小值;然后将左边的数+1移动到比它小的数。这一步是为了得到最终的排列结果。导入java.util.Arrays;publicclassLeetCode_031{publicstaticvoidnextPermutation(int[]nums){//如果数组为空,或者数组长度为0或者只有一个元素,不处理if(nums==null||nums.length<2){返回;}//是否寻找更大的排列booleanhandled=false;//先找到需要转置的数intleft=-1,right=-1;for(inti=nums.length-1;i>0;i--){for(intj=i-1;j>=0;j--){if(nums[i]>nums[j]){如果(j>左){左=j;对=我;}elseif(j==left){if(i==right){left=j;对=我;}}handled=true;休息;}}}if(handled){//找到一个更大的排列//1.结合右和交换(数字,左,右);//2.先将right+1后的数取反for(intx=right+1;x<(nums.length+right+1)/2;x++){exch(nums,x,nums.length-1-(x-右)/2);}//3.然后把left+1到right-1和right+1到nums的数组合起来。长度为1的数的整体转置顺序for(intx=right-1;x>=left+1;x--){for(inty=x;y
