力扣 31. 下一个排列

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须 原地 修改,只允许使用额外常数空间。

解析:

找到输入数组字典序中的下一个位置,感觉像是找规律一样..... (可以多举几个例子,找一下其中的共同点) 比如1,2,3,4,5的下一个字典序为1,2,3,5,4 可以看到只改变了最后两个数字,因为整个序列都是升序的

再比如1,5,4,3,2的下一个字典序为2,5,4,3,1 可以看到5,4,3,2是降序的,就需要找到比1的大的最小数字2,和1交换位置,然后后面的升序排序

于是,从中总结出规律,需要先找到左右两个下标left和right,left表示最后一组的升序数字的第1个,right表示left后面的数字中比l大的最靠右的数字,比如
1,2,3,4,5 -> left = 4 , right = 5
1,5,4,3,2 -> left = 1 , right= 2
然后,将left和right位置的数字交换,交换后,对left后面部分的数字进行升序排序即可

Java:

class Solution {
    public void nextPermutation(int[] nums) {
        int left = 0, right = nums.length - 1;
        for(int i = 0; i < nums.length - 1; i++) {
            if(nums[i] < nums[i + 1]) {
                left = i;
            }
        }
        for(int i = left + 1; i < nums.length; i++) {
            if(nums[i] > nums[left]) {
                right = i;
            }
        }
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
        Arrays.sort(nums, left + 1, nums.length);
        return;
    }
}

JavaScript:

var nextPermutation = function(nums) {
    let left = 0, right = nums.length - 1;
    for(let i = 0; i < nums.length - 1; i++) {
        if(nums[i] < nums[i + 1]) {
            left = i;
        }
    }
    for(let i = 0; i < nums.length; i++) {
        if(nums[i] > nums[left]) {
            right = i;
        }
    }
    let temp = nums[left];
    nums[left] = nums[right];
    nums[right] = temp;
    let arr = nums.slice(left+1);
    arr.sort((a,b) => a - b);
    nums.splice(left+1,nums.length - left, ...arr);
    return;
};
全部评论

相关推荐

神哥不得了:神哥来啦~自我评价和校园经历的话可以直接删了,从大厂暑期的话应该没有什么太多问题,应该是能拿到很多大厂面试机会的,就是在面试的时候表示的好一点就行,可以在面试前先把高频top 50的八股多巩固几遍,千万不要看那些假高频八股,这两个项目的话问题不是很大,应该能够帮你找到大厂实习的,算法的话一定要刷起来,因为大厂有些还是比较看重算法的
点赞 评论 收藏
分享
永不遗忘:才这么点算什么拉黑,我初筛连着挂几十次了,最后还是能进面
点赞 评论 收藏
分享
03-13 21:15
江南大学 Java
多少分能进面啊?卡测评吗?做的我道心破碎了💔
小南瓜_66:A3 第四道题为什么用例过了 结果显示0%
投递携程等公司10个岗位 > 携程求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务