每日一题——下一个排列

news2024/11/13 12:12:57

下一个排列

题目链接

在这里插入图片描述


读懂题目

要理解题目的意思,主要是要读懂这一句:整数数组的 下一个排列 是指其整数下一个字典序更大的排列

我们来逐词分析:

  • 其整数,即我们要将这个数组的数字构成一个十进制整数,例如数组[1,2,3]看成数字就是123,数组[4,0,3,2,1]看成数字就是40321
  • 下一个字典序更大:即我们要通过改变数组中的元素位置,从而使组成的整数大于原来的整数,并且变化幅度尽可能小。例如数组[1,2,3]的下一个排列就是[1,3,2](132大于123,且相较于由1,2,3组成的更大的数字变化幅度最小)

还有一个例外情况:如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)

  • 例如数组[3,2,1],构成的整数321已经是这三个数据所能构成的最大整数,因此它的下一个排列就是这三个数字的升序排列[1,2,3]

思路

我们以数组[4,5,2,6,3,1]为例,来讨论如何找到它的下一个排列:

  • 首先我们应该清楚,下标越小的数字,组成数据时位数越高,因此寻找下一个排列时尽量不要动前面的数字,即应该从低位数据开始考虑

在这里插入图片描述

  • 我们看到,后面的数字631已经是逆序排序,即[6,3,1]这三个数字组成的最大数字,因此我们不能仅仅通过改变这三个数的位置来找到下一个排列

  • 因此我们要继续向前看:到了数字2,我们发现**[2,6,3,1]不是逆序排序了**,即我们可以通过改变[2,6,3,1]这四个数的位置来找到到下一个排列,即次大数。那么具体的,该怎么改变才能保证改变后的数比之前的数大,并且变化幅度最小呢?
  • 由于[6,3,1]已经是降序排序,因此我们必须要增大更高位的数字2,而为了使变化幅度最小,我们应该将数字2, 3交换位置,并且使交换完后3后的数据为升序排序。

  • 最后,就得到了下一个排列[4,5,3,1,2,6]

总的来说就是:

我们需要将一个左边的较小数与一个右边较大数交换,以能够让当前排列变大,从而得到下一个排列。

同时我们要让这个较小数尽量靠右,而较大数尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。

我们可以这样描述我们的算法:

  • 从后向前遍历数组元素,直到出现**nums[i] < nums[i+1]这样,较小数min就是nums[i]**
  • 从后往前遍历数组元素,直到出现**nums[j] > min,这样较大数max就是nums[j]**
  • 交换较小数min较大数max的位置,这样就得到了更大的数
  • 较大数max后的数据转换为升序排序,这样就可以使变化幅度最小,即得到下一个排列

注意:

  • 如果整个数组已经是降序排序,那么就不存在更大的数,难么他的下一个排列就是组成这个数组数据的升序排序. 而将降序转升序不需要采用时间复杂度较高的排序算法, 直接将整个数组反转即可, 时间复杂度为O(N)
  • 较大数较小数交换后, 将较大数后的数转为升序同理.

实现代码

//实现[left, right]区域数据的反转
void Reverse(int* nums, int left, int right)
{
    while (left <= right)
    {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;

        left++;
        right--;
    }
}

//交换数据
void Swap(int *num1, int *num2)
{
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}

void nextPermutation(int* nums, int numsSize){
    //先找到 较小数
    int min;
    for (min = numsSize - 2; min >= 0; min--)
    {
        if (nums[min] < nums[min + 1])
            break;
    }
    
    //如果较小数不存在,那么直接将数组反转即可
    if (min < 0)
    {
        Reverse(nums, 0, numsSize - 1);
        return;
    }
	
    //找较大数
    int max;
    for (max = numsSize - 1; max > min; max--)
    {
        if (nums[max] > nums[min])
            break;
    }
	
    //交换较小数和较大数
    Swap(&nums[min], &nums[max]);
	
    //反转较大数后的数据
    Reverse(nums, min + 1, numsSize - 1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/959923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android之自定义时间选择弹框

文章目录 前言一、效果图二、实现步骤1.自定义Dialog2.xml布局3.背景白色转角drawable4.取消按钮背景drawable5.确定按钮背景drawable6.NumberPicker样式和弹框样式7.弹框动画8.Activity使用 总结 前言 随着产品人员不断变态下&#xff0c;总是会要求我们的界面高大上&#xf…

JVM之堆和方法区

目录 1.堆 1.1 堆的结构 1.1.1 新生代&#xff08;Young Generation&#xff09; 1.1.2 年老代&#xff08;Old Generation&#xff09; 1.1.3 永久代/元空间&#xff08;Permanent Generation/Metaspace&#xff09; 1.2 堆的内存溢出 1.3 堆内存诊断 1.3.1 jmap 1.3.2…

五大优势,让你坚定选择低代码开发平台

随着数字化时代的到来&#xff0c;企业纷纷寻求新的方式来提高业务效率、降低成本&#xff0c;并满足不断变化的客户需求。在这个过程中&#xff0c;低代码平台逐渐成为一种备受瞩目的技术&#xff0c;因为其具有五大特殊优势&#xff0c;能够极大地提高企业数字化转型的效率。…

如何用代理IP解决Tik Tok直播时卡顿的问题?

Tik Tok如今已经成为了一种非常流行的社交互动模式&#xff0c;但是在直播过程中突然的卡顿往往会让人抓狂&#xff0c;流失很多客户。除非您的内容足够吸引人&#xff0c;不然很少有人会有耐心等下去。每每遇到这种情况&#xff0c;运营Tik Tok的朋友就会开始挠头&#xff0c;…

算法通关村——从40个亿中产生一个不存在的整数

Titile: 海量数据场景下的热门算法题 从40个亿中产生一个不存在的整数 题目要求&#xff1a;给定一个输入文件&#xff0c;包含40亿个非负整数&#xff0c;请设计一个算法&#xff0c;产生一个不存在该文件中的整数&#xff0c;假设你有1GB的内存来完成这项任务。 进阶&…

总线:特性、分类、性能指标、系统总线的结构、总线仲裁、总线定时、总线标准

总线&#xff08;Bus&#xff09;&#xff0c;是一组为各功能部件之间进行信息传送的公共线路。 总线的特性&#xff1a; 机械特性&#xff08;物理特性&#xff09;&#xff1a;尺寸、形状、引脚数、排列顺序。电气特性&#xff1a;每根信号线上的信号传输方向、表示信号有效…

六、员工信息分页+启用/禁用员工账号(前端经典大数/精度丢失问题)

员工信息分页 整体流程&#xff1a; 1、创建mybatisplus配置类 在config包下创建mybatisplusconfig /*** 配置MybatisPlus分页插件*/ Configuration //既然是配置类&#xff0c;要加配置类的注解 public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatis…

【VirtualBox】安装Ubuntu

一、新建虚拟系统 点击新建 输入名称&#xff0c;点击下一步 配置内存大小和处理器&#xff0c;点击下一步 选择不添加虚拟硬盘&#xff0c;点击下一步 点击完成 点击继续 二、修改虚拟机硬件配置 选择虚拟机&#xff0c;点击 “设置” 进入 “系统 -> 主板” 页面&…

131页8万字数字化矿山整体解决方案WORD(矿山资料合集)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除&#xff0c;更多浏览公众号&#xff1a;智慧方案文库 目 录 1、煤矿综合自动化系统概述 1.1、煤矿数字化系统发展方向 1.2、建设必要性和意义 1.3、矿井综合自动化系统设计…

应用案例 | 3D视觉引导解决方案汽车零部件上下料

Part.1 行业背景 三维视觉引导技术在国内外汽车零部件领域得到了广泛应用。随着汽车制造业的不断发展和创新&#xff0c;对于零部件的加工和装配要求越来越高&#xff0c;而三维视觉引导技术能够帮助企业实现更精确、更高效的零部件上下料过程。 纵览国外&#xff0c;部分汽车…

【仿写spring之ioc篇】二、bean生命周期中的创建以及属性赋值

扫描类 这个类就不多说了&#xff0c;基本所有框架都要有这一步&#xff0c;这里主要关注我们目前要实现的方法&#xff0c;其他的具体方法可以查看源码 isComponent方法 /*** 扫描所有带有Component注解的java类&#xff0c;放入到BeanRegistry** return boolean*/public bo…

【前端demo】圣诞节灯泡 CSS动画实现轮流闪灯

文章目录 效果过程灯泡闪亮实现&#xff08;animation和box-shadow&#xff09;控制灯泡闪亮时间和顺序&#xff08;animation-delay&#xff09;按钮开关 代码htmlcssjs 参考代码1代码2 前端demo目录 效果 效果预览&#xff1a;https://codepen.io/karshey/pen/zYyBRWZ 参考…

初出茅庐的小李博客之STM32F103C8T6音乐控制器实战教程【1】

STM32F103C8T6音乐控制器实战教程[1] USB简单介绍&#xff1a; "USB"代表通用串行总线&#xff08;Universal Serial Bus&#xff09;&#xff0c;是一种用于连接计算机及其外部设备的标准接口。USB接口允许各种设备&#xff08;如打印机、存储设备、键盘、鼠标、摄…

为何电商行业都在争相使用WhatsApp引流小挂件?

WhatsApp小挂件是嵌入在网站上的聊天小部件&#xff0c;允许访问者同WhatsApp与您联系。点击后&#xff0c;它会将客户带到移动或桌面 WhatsApp应用程序&#xff0c;或者直接打开一个对话框&#xff0c;客户可以在这些地方与您发起对话。让我们看看在您的网站上拥有WhatsApp聊天…

Java实现MQTT订阅发布

一. MQTT 与 EMQX MQTT 是轻量级基于代理的发布/订阅的消息传输协议。使用发布/订阅消息模式&#xff0c;提供一对多的消息发布&#xff0c;解除应用程序耦合。底层使用 TCP/IP 提供网络连接。 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开…

Vue+Element-ui实现表格本地导入

表格文件存储在前端 如图&#xff0c;表格文件template.xlsx存储在public下的static文件夹下 注意这里的路径容易报错 a链接下载文件失败的问题(未发现文件&#xff09; a.href ‘./static/template.xlsx’ 写的时候不能带public&#xff0c;直接这么写就可以 DownloadTemp…

星域的庞大规模已经让我们眩晕

有一句道格拉斯亚当斯的名言银河系漫游指南我最近想了很多。“空间很大&#xff0c;”他写道。“你不会相信它有多么巨大&#xff0c;令人难以置信。我的意思是&#xff0c;你可能认为去药店的路很长&#xff0c;但那只是去太空的小钱。” 星域不妨把这句引言放在其设计文档的封…

从天镜大模型,透视马上消费的“三重价值”

AI正在打开新世界。 红杉资本曾发表名为《生成式AI&#xff1a;一个创造性的新世界》的文章&#xff0c;提到生成式AI将涉及数十亿的人工劳动力&#xff0c;并促使这些人工劳动力的效率和创造力至少提高10%&#xff0c;有潜力产生数万亿美元的经济价值。 大模型&#xff0c;被…

2 | Window 搭建单机 Hadoop 和Spark

搭建单机 Hadoop 和 Spark 环境可以学习和测试大数据处理的基础知识。在 Windows 操作系统上搭建这两个工具需要一些配置和设置,下面是一个详细的教程: 注意: 在开始之前,请确保你已经安装了 Java 开发工具包(JDK),并且已经下载了 Hadoop 和 Spark 的最新版本。你可以从…

程序员:你如何写可重复执行的SQL语句?

上图的意思&#xff1a; 百战百胜&#xff0c;屡试不爽。 故事 程序员小张&#xff1a; 刚毕业&#xff0c;参加工作1年左右&#xff0c;日常工作是CRUD 架构师老李&#xff1a; 多个大型项目经验&#xff0c;精通各种开发架构屠龙宝术&#xff1b; 小张注意到&#xff0c;在…