leetCode:Next Permutation

Next Permutation

题目

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

给定一个序列,如1,2,3求下一个比它大的由相同元素组成的序列。

思路

从低位到高位如果是升序,则已经是最大值。找到开始降序的位记为n,将它与低位的符合条件的数相交换,这个条件是:低位的数最贴近地大于开始降序的那个位的数值。最后,将n后的低位再按升序排列。即可得到最贴近地大于原序列的新序列了。

AC代码

public class Solution {
    public void nextPermutation(int[] nums) {
        if( nums.length <= 1){
            return;
        }
        int i = nums.length - 2;
        //找到降序位
        while( i >= 0 && nums[i] >= nums[i+1]){
            i--;
        }
        // 如果这个下降点还在数组内,我们找到一个比它稍微大一点的数替换
        // 如果在之外,说明整个数组是降序的,是全局最大了
        if(i >= 0){
            for(int k = nums.length - 1; k > i; k--){
                if(nums[k] > nums[i]){
                    swap(nums, k, i);
                    break;
                }

            }
        }
        //将降序位以后的低位部分倒序成为一个最小序列
        reverse(nums, i + 1, nums.length - 1);



    }

    private void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    private void reverse(int[] nums,int left, int right){
        while(left < right){
            swap(nums, left, right);
            left++;
            right--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值