LintCode: 190. 下一个排列

题目:


分析:

先看一个例子,

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--;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_27139155/article/details/80289178