LC31 - 下一个排列

这题直接举个例子更直观
{1, 5, 8, 4, 7, 6, 5, 3, 1} 这样一个序列,我们想找比他大的下一个排序,那么首先要从后往前找第一个非升序的数字,也就是a[i] < a[i+1]的第一个(如果整个数组都是降序排列,说明它已经是最大的排列了,直接反转数组得到第一个排列),于是我们找到了4。这时候为了得到更大的序列,我们需要把4和它后面的一个比它大的数字交换,同时为了使交换之后的序列增大最小,我们需要找到从后往前第一个比4大的数字,于是我们又找到了5,将他们交换后得到 {1, 5, 8, 5, 7, 6, 4, 3, 1}, 最后将交换完成后的5之后的序列从小到大重排序,得到{1, 5, 8, 5, 1, 3, 4, 6, 7}就是原排列的下一个排列了。

代码如下

class Solution {
    public void nextPermutation(int[] nums) {
        if(nums == null && nums.length <= 1) return;
        int i = nums.length - 2;
        while(i>=0 && nums[i] >= nums[i+1]){
            i--;
        }
        if(i < 0){
            reverseArray(nums, 0);
            return;
        }
        for(int j = nums.length - 1; j>i; j--){
            if(nums[i] < nums[j]){
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
                break;
            }
        }
        reverseArray(nums, i+1);

    }

    public static void reverseArray(int[] a, int start){
        int l = start;
        int r = a.length - 1;
        while(l < r){
            int tmp = a[l];
            a[l] = a[r];
            a[r] = tmp;
            l++;
            r--;
        }
    }
}
全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务