首页 > 其他分享 >31. 下一个排列

31. 下一个排列

时间:2024-10-19 23:31:41浏览次数:7  
标签:排列 nums 一个 31 get list int 升序

实现一个算法,找出整数数组中的下一个排列。即字典序比当前排列大的最小排列。

示例

  • 输入:[1,2,3]
    输出:[1,3,2]
  • 输入:[3,2,1]
    输出:[1,2,3]
  • 输入:[1,1,5]
    输出:[1,5,1]

说明

  1. 整数数组中的元素各不相同。
  2. 给定数组始终有效,即始终存在下一个排列。

解题思路

  1. 如果要让一个数尽量大,需要把较大的数字往高位排。
  2. 如果一个数组成的数字是由大到小排序,那么这个数就是最大数,它的下个排列,就是最小数。最小数与最大数相反,它数由组成的数字由从小到大排序。
  3. 我们希望下一个数 比当前数大,这样才满足 “下一个排列” 的定义。因此只需要 将后面的「大数」与前面的「小数」交换,就能得到一个更大的数。比如 123456,将 5 和 6 交换就能得到一个更大的数 123465。
  4. 我们还希望下一个数 增加的幅度尽可能的小,这样才满足“下一个排列与当前排列紧邻“的要求。为了满足这个要求,我们需要:
    • 在尽可能靠右的低位 进行交换,需要 从后向前 查找将一个 尽可能小的「大数」 与前面的「小数」交换。比如 123465,下一个排列应该把 5 和 4 交换而不是把 6 和 4 交换
    • 将「大数」换到前面后,需要将「大数」后面的所有数 重置为升序,升序排列就是最小的排列。以 123465 为例:首先按照上一步,交换 5 和 4,得到 123564;然后需要将 5 之后的数重置为升序,得到 123546。显然 123546 比 123564 更小,123546 就是 123465 的下一个排列
public void nextPermutation(int[] nums) {
        int i = 0;
        int j = 0;
        for (int m = nums.length - 1; m > 0; m--) {
            //1.从右往左找到第一个降序点
            if (nums[m] > nums[m - 1]) {
                i = m - 1;
                j = m;
                break;
            }
        }
        //2.如果整个数组是降序排列,则是最大值。下一个排列,就是最小值,升序排列。
        if (j == 0) {
            Arrays.sort(nums);
            return;
        }
        //3.从右往左的升序中找到一个最小的「大数」往前排序。
        for (int m = nums.length - 1; m > 0; m--) {
            if (nums[m] > nums[i]) {
                swap(nums, i, m);
                //4.把右到左的升序排序成降序,尽量把数字的大小降小
                Arrays.sort(nums, j, nums.length);
                break;
            }
        }
    }

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

还有一个题目求上个排列
https://www.lintcode.com/problem/51/

    public List<Integer> previousPermuation(List<Integer> nums) {
        int i = 0;
        int j = 0;
        for (int m = nums.size() - 1; m > 0; m--) {
            //1.从右往左找到第一个升序点
            if (nums.get(m) < nums.get(m - 1)) {
                i = m - 1;
                j = m;
                break;
            }
        }
        //2.如果整个数组是升序排列,则是最小值。下一个排列,就是最大值,降序排列。
        if (j == 0) {
            nums.sort(Comparator.reverseOrder());
            return nums;
        }

        for (int m = nums.size() - 1; m > 0; m--) {
            if (nums.get(m) < nums.get(i)) {
                swap(nums, i, m);
                nums.subList(j, nums.size()).sort(Comparator.reverseOrder());
                break;
            }
        }
        return nums;
    }
    
    public static <T> void swap(List<T> list, int index1, int index2) {
        T temp = list.get(index1);
        list.set(index1, list.get(index2));
        list.set(index2, temp);
    }

标签:排列,nums,一个,31,get,list,int,升序
From: https://www.cnblogs.com/clarencezzh/p/18486736

相关文章

  • 【前端】如何制作一个自己的网站(11)
    接上文。除了前面的颜色样式外,字体样式和文本样式也是网页设计中的重要组成部分。合适的字体和文本排版,不仅可以使页面更加美观,也可以提升用户体验。接下来,我们先来看看CSS如何设置字体样式。字体样式同时设置了字体样式的四个属性:字体类型、字体风格、字体粗细和字体大......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标门电路组合电路,逻辑电路冯诺依曼结构CPU,内存,IO管理嵌入式系统,并行结构物理安全作业正文https://www.cn......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第4周学习总结
    2024-2025-120241311《计算机基础与程序设计》第4周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业这个作业的目标<写上具体方面>作业正......
  • 编写一个通用的i2c设备驱动框架
    往期内容I2C子系统专栏:I2C(IIC)协议讲解-CSDN博客SMBus协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析:注册篇内核提供的通用I2C设备驱动I2C-dev.c分析:file_ops篇设备驱动与设备树匹配机制详解......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第四周学习总结
    2024-2025-120241316《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第四周作业这个作业的目标<学习门电路,组合电路,逻辑电路,冯诺依曼结构,CPU,内存,IO管......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标学习门电路,组合电路,逻辑电路,冯诺依曼结构,CPU,内存,IO管理,嵌入式系统,并行结构,物理安全作业正文https://www......
  • 如何制作DIY一个低成本高性能的遥控玩具坦克?
    前言小学一年级的时候,第一次在深圳沙井的商场看到了遥控挖掘机,每次去那个商场我都会默默地去看一看挖土机玩具,那时就萌生了一个梦想,长大了一定要买一个遥控挖掘机。时光荏苒,儿时的梦想,如今依然记得,现在有能力买挖掘机,但是却没有了买一台挖掘机玩具的想法了。随着创客的火爆,从2015......
  • Lag-Llama:第一个时间序列预测的开源基础模型
    Lag-Llamalagllama是为单变量概率预测而构建的。它使用不依赖于频率的通用方法来标记时间序列数据。这样模型可以很好地推广到不可见的频率。它利用Transformer体系结构和分布头来解析输入令牌,并将它们映射到具有置信区间的未来预测。一、具有滞后特征的标记laglllama的......
  • 设计一个可复用的 ArkWeb 基础组件架构
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。引言在华为鸿蒙开发环境中,ArkWeb组......
  • 【AI副业项目】太离谱了!爆涨粉47W+,下一个风口项目AI+大健康养S赛道,教你如何用AI做爆
    前言大家好,我是随风,2024年AllinAI副业变现!每天分享一个靠谱的副业项目,每月多赚几千元!喜欢的朋友可以点个关注加个星标~~我一直说小红薯平台是最适合新手素人做的平台,去中心化的平台,任何普通人都可以在这个平台分一杯羹的平台。但但但是很多朋友发小红薯作品都是超低的......