数组的合并和升序排列_leetcode No.31 下一个排列

9f030a56ad7c663dca7d6c8040121238.png

题目链接:

下一个排列 - 力扣(LeetCode)​leetcode-cn.com
7003efaddc54fc9e488c1ab51035b6d2.png

题目描述:

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

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

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

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,31,3,23,2,11,2,31,1,51,5,1

解题思路:

最直接的想法是暴力法,找出由给定数组的元素形成的列表的每个可能的排列,并找出比给定的排列更大的排列。但是时间复杂度是

,因为可能的排列总计有
个,爆表了都,我们得想想有没有更快的算法。

首先,如果是一个降序数组,没有可能有下一个更大的排列,直接反转变成升序数组就好。

然后,我们再来看看一般情形,假设数组名为

,长度为
,这个数组中必然存在着
,使得
,我们对
以及其右边的数进行重新排列就可以得到一个比初始排列大的排列。

而要想找到下一个排列,我们可以从右往左来找到第一对满足

。接着,我们需要在
的右边发现一个
,使得
,且
在所有大于
的值中最小,我们交换
的位置。

5ca28141cdf9183eabfe968e50e81f65.png
来自 leetcode 官方题解

现在在索引

处有正确的数字。但目前的排列仍然不是答案,我们需要通过仅使用
右边的数字来形成最小的排列。 因此,我们需要放置那些按升序排列的数字,以获得最小的排列。

可能你想到直接排序就好了嘛,但其实还有更简单的方法。因为在从右侧扫描数字时,我们只是持续递减索引直到我们找到

这对数。其中,
右边的所有数字都已按降序排序。此外,交换
也并未改变该顺序。因此,我们只需要反转
之后的数字,就可以获得下一个最小的字典排列。

代码如下:

class Solution {
public:void nextPermutation(vector<int>& nums) {int n = nums.size(), k, l;for (k = n - 2; k >= 0; k--) {if (nums[k] < nums[k + 1]) {break;}}if(k < 0) {reverse(nums.begin(), nums.end());}else {for (l = n - 1; l > k; l--) {if (nums[l] > nums[k]) {break;}}swap(nums[k], nums[l]);reverse(nums.begin()+k+1, nums.end());}}
};

其实 C++ 里面有库函数 next_permutation 可以直接帮我们获取下一个排列。。。

如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。

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

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

相关文章

公司网络故障那些事(路由器变交换机)

首先这次网络故障是断电引起的 我给大家画个模型 三层的为八口交换机 一层的为五口打印机 笔记本代表两台无线打印机 首先八口的连接了公司采购电脑一台&#xff0c;业务电脑一台&#xff0c;其他电脑三台 第二个五口交换的连接财务电脑两台 最后一个五口交换机连接两台无线打印…

【原创】大公司为什么还在采用过时的技术

背景 本文出自一朋友给我的提问&#xff0c;于是博主呕心沥血给他花式洗脑了几个小时。忽然发现&#xff0c;应该还有许多朋友有同样的疑问。所以整理成文。 许多刚毕业的程序员朋友&#xff0c;都有一个执念&#xff0c;想要进那种规模大一点的公司、上市的、业内有名的最好。…

java 文件上传 配置_SpringMVCMultipartFilefile文件上传及参数接收

一、form表单属性中加上enctype"multipart/form-data"form表单的二、配置文件中配置MultipartResolver文件超出限制会在进入controller前抛出异常&#xff0c;在允许范围内这个配置无影响三、MultipartFile接受文件并通过IO二进制流(MultipartFile.getInputStream())…

list foreach方法_Java集合三兄弟List,Set,Map你分的清楚吗?

前言集合作为Java基础知识的核心部分&#xff0c;不论是在面试还是平时工作中都是经常遇见的。当然面对熟悉的List、Set、Map&#xff0c;面试管的提问一般也都不会从简单的问题出发了&#xff0c;今天就来聊下集合中的高级部分&#xff0c;让你对它们的理解更加清楚。一、List…

centos7.3防火墙配置

Centos7.3防火墙配置 1、查看firewall服务状态 systemctl status firewalld 2、查看firewall的状态 firewall-cmd --state 3、开启、重启、关闭、firewalld.service服务 开启 service firewalld start 重启 service firewalld restart 关闭 service firewalld stop 4、…

SpringBoot使用Jsp

本文是简单总结一下SpringBoot使用Jsp的Demo。 前言 在早期做项目的时候&#xff0c;JSP是我们经常使用的java服务器页面&#xff0c;其实就是一个简化servlet的设计&#xff0c;在本文开始之前&#xff0c;回顾一下jsp的几大对象&#xff0c;如图。 而在现在SpringBoot框架流行…

java 持久_Java持久锁总结 -解道Jdon

并发主题Java与持久相关的锁总结本文总结Java中有关数据库保存持久数据的锁机制&#xff0c;不只是纯粹数据库自身的锁&#xff0c;本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。在并发理论中&#xff0c;锁是用于保护可变的共享数据&#xff0c;以…

cacti 监控安装失败

1首先这是基于lnmp模式进行的 2yum安装 yum -y install httpd mysql mysql-server php php-mysql php-json php-pdo 3lib库 yum -y install cairo-devel libxml2-devel pango pango-devel 4 解压rrdtool-1.3.1.tar.gz Cd rrdtool-1.3.1 ./configure --prefix/usr/local/rrdtoo…

project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...

施工进度横道图不会做&#xff1f;18份计划模板收藏好&#xff0c;输入参数迅速成图作为施工组织设计的关键内容&#xff0c;施工进度计划控制了工程施工进度、工程施工期限等各项施工活动。进度计划是否合理&#xff0c;直接影响施工速度、成本和质量。因此施工中的其他工作必…

JavaScript学习系列3 -- JavaScript arguments对象学习

在实际项目开发中&#xff0c;目前还是很少使用到JavaScript 中的arguments对象&#xff0c;那么它到底是干什么用的呢 arguments是JavaScript中的一个类数组对象&#xff0c;它代表传给一个正在执行的函数function的参数列表。 看完这个定义&#xff0c;需要明白&#xff0c…

二叉树垂直遍历 java_【004】二叉树垂直遍历

二叉树垂直遍历题目描述输入输出示例输入实例输出DFSBFS更简单的方法二叉树垂直遍历题目描述对于一个二叉树&#xff0c;输出它的垂直遍历结果&#xff1b;对于同一列的节点&#xff0c;按照从左向右&#xff0c;从上向下的顺序排列。例如&#xff0c;对于以下二叉树&#xff1…

matlab二元一次方程求解_2-函数的求解计算

一、本期介绍函数的求解有两种&#xff08;1&#xff09;已知x求y&#xff08;2&#xff09;已知y求x1.1已知x求y回想我们上一期&#xff0c;讲了多项式求解的方法&#xff0c;也是已知x求y。想一下&#xff0c;多项式不也是函数的一种吗&#xff0c;所以本期求解的方法同样适用…

linux lnmp yum版安装

LAMP&#xff08;linux、apache、mysql、php&#xff09;&#xff0c;是四个套件的合成&#xff0c;简单讲就是要把php运行在linux上&#xff0c;需要依赖apache和mysql数据库。 1 准备好一个linux系统&#xff08;centos7&#xff09;   确保selinux、firewall已经关闭   …

面向对象的四大特征

面向对象的四大特征 面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。 面向对象程序设计&#xff0c;是通过为数据和代码建立分块的内存区域&#xff0c;以便提供对程序进行模块化的一种程序设计方法。对象是计算机内存中的一块区域&#xff0…

python装饰器调用顺序_聊一聊Python装饰器的代码执行顺序

为什么写这篇文章&#xff1f;起因是QQ群里边有人提了一个问题&#xff1a;之前导入模块只需要1~2秒&#xff0c;为什么现在变成需要2~3分钟&#xff1f;我的第一感觉是&#xff1a;是不是导入的模块顶层代码里边&#xff0c;做了什么耗时的事情。隔了一天&#xff0c;他的问题…

centos7 安装cacti

1 cacti运行环境准备   cacti需要phpapachemysqlsnmpRRDTool&#xff0c;以及cacti本身。cacti本体是用php开发的网站&#xff0c;通过snmp对远端设备信息进行采集。apachemysqlphp在以前已经做过了      这里只对剩余的部分进行安装。 2 安装snmp    yum install -y n…

python第三方库-基础

1.python社区 python有一个全球社区&#xff0c;提供了超过十三万个涵盖各种领域应用的第三方库&#xff0c;该社区可通过 http://pypi.org/ 来访问。PyPI&#xff08;Python Package Index&#xff09;是python包的索引&#xff0c;学会检索并利用PyPI&#xff0c;找到合适的第…

python折线图matplotlib库_Python如何使用内置库matplotlib绘制折线图

这篇文章主要介绍了Python如何使用内置库matplotlib绘制折线图,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下环境准备&#xff1a;需要安装matplotlib&#xff0c;安装方式&#xff1a;pip install matplotlib…

linux下zabbix安装

1本人用的是apachemysqlphp 2下载zabbix软件包&#xff0c;官网下载 https://sourceforge.net/projects/zabbix/files/ZABBIX Latest Stable/2.2.23/zabbix-2.2.23.tar.gz/download 上传到 var/www/html下 3cd /var/www/html #进入软件包下载目录 tar zxvf zabbix-2.2.23.tar.g…

java cas机制_Java CAS机制详解

CAS目的&#xff1a;在多线程中为了保持数据的准确性&#xff0c;避免多个线程同时操作某个变量&#xff0c;很多情况下利用关键字synchronized实现同步锁&#xff0c;使用synchronized关键字修可以使操作的线程排队等待运行&#xff0c;可以说是一种悲观策略&#xff0c;认为线…