常考的技巧类算法题(一):下一个排列

技巧类算法题是我随口提的一个概念,意思就是这道题有自己独特的思考思路,仅仅知道它所涉及的最基础的知识点(如宽泛的双指针,动规或深度优先搜索),然后自行推理解题套路十分困难。因此在此做一个整理,面试前过一遍

题目链接:下一个排列

题目描述

整数数组的一个排列就是将其所有成员以序列或线性顺序排列。下一个排列是指字典序更大的所有排列中,最小的那一个。如果这个排列已经是这几个元素所能组成的最大的字典序时,返回字典序最小的排列。

例如,123的下一个排列是132,321的下一个排列是123,1511的下一个排列是5111

传递的参数是vector的引用,因此只能在原数组上修改,空间复杂度为O(1)

问题分析

你要找下一个排列,就需要让一个大一点的数和一个小一点的数交换位置。但是你又希望字典序增大幅度尽可能地小,所以如果将vector看作一个数,你应该优先动数位较低的数,即应该从vector后面往前遍历。

那什么时候停止遍历开始进行下一步操作呢?当然是目前所访问的数,大于数组中索引比他小一位的数。这一段略抽象,举个例:

[1,2,3,6,5,4,1]

在这个数组中,如果你在654这三个数中随便交换两个,他们都会变大,因为在这个范围内,nums[i]>nums[i+1],因此要找到nums[i]<nums[i+1]的地方,才能开始交换树的位置。

易知,当访问到3和6时,开始下一步。下一步,我们要决定谁和3进行交换,如果是3和6互换,那么nums[2]的位置会急剧变大,显然不是字典序只相差一位。可如果在3后面的数中找出最小的那一个,那会把最末尾的1和3互换,字典序反而变小了。显然,我们要找到一个刚好比3大的数。

因此,从数组末尾遍历,找到第一遇到的比3大的数就行。因为3后面的数是降序,所以遇到第一个比3大的数之后,加下来遍历的数只会更大,因此可以直接break跳出循环。

在结束循环后,还有一个小细节,3后面的那一块排列,有可能变小吗?当然,把1移到6的位置就能让排列变小。既然只交换3和4后还能变小,就说明单纯地交换之后不是我们所要的结果,为了让后面的区间的排列尽可能小,可以通过sort函数使其变为升序排列。

最后,如果找不到任何一组相邻的数是升序该怎么办呢?很简单,反转数组就行。

代码

class Solution {
public:void nextPermutation(vector<int>& nums) {int n=nums.size()-1;//寻找第一次出现逆序的相邻两数//从数组尾部找起,相当于从数字较低的位找起for(int i=n;i>=1;i--){//满足if,说明找到了第一次出现升序的相邻数对if(nums[i]>nums[i-1]){//再次从末尾找起,寻找刚好比i-1要大的数for(int j=n;j>=i;j--){//找到了可以直接break,此时i-j之间的数一定比nums[j]大if(nums[j]>nums[i-1]){int temp=nums[j];nums[j]=nums[i-1];nums[i-1]=temp;break;}}//最后,将i-1后面的部分进行排序,使他们的字典序尽可能小sort(nums.begin()+i,nums.end());return;}}//因为满足for里面的if后,必定会执行return//所以函数但凡执行到这里,就说明nums完全单调递减,字典序达到了最大//此时将数组反即可//不要用排序,毕竟排序要多次比较,玩意sort底层算法用了快排,时间复杂度直接O(nlogn)//而反转函数完全不比较大小,O(n)时间复杂度搞定reverse(nums.begin(),nums.end());return;}
};

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

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

相关文章

Mybatis解析mybatis-config.xml过程

文章目录 1. 相关代码2. 加载资源3. 创建SqlSessionFactory3.1 整体创建过程3.2. 创建XMLConfigBuilder.3.2.1 XMLConfigBuilder 的核心字段3.2.2 BaseBuilder 3.3 创建Configuration3.4 全局配置文件解析过程3.4.1 parseConfiguration方法3.4.2 properties标签解析3.4.3 setti…

flink on yarn 中的flink-conf.yaml参数

在 Flink on YARN 中,flink-conf.yaml 是 Flink 配置文件,用于配置 Flink 应用程序在 YARN 上的运行。通过修改 flink-conf.yaml 文件中的参数,你可以调整 Flink 集群的行为和性能。以下是一些常见的在 flink-conf.yaml 中设置的参数: yarn.application.name: 指定 Flink 应…

Go速成-常量

1.常量的定义 Go语言常量&#xff0c;定义的值是不能进修修改的&#xff0c;定义常量就是const&#xff0c;常量定义建议全部大写 const PI float32 3.1415946 //显式定义 const (x int 16ys "abc"z)fmt.Print(x,y,s,z) 在定义常量的时候如果没有声明值&#xff…

深入理解Spring中的立即加载和延迟加载

引言 在使用Spring框架进行开发时&#xff0c;掌握加载策略是至关重要的。Spring框架提供了两种主要的加载策略&#xff1a;立即加载&#xff08;Eager Loading&#xff09;和延迟加载&#xff08;Lazy Loading&#xff09;。这两种加载策略在不同的场景下有各自的优势和适用性…

Gradle和Aritifactory,实现上传Apk并发送消息到钉钉

Gradle和Aritifactory 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/131746580 文章目录 Gradle和AritifactoryGradle基本介绍Gradle插件开发流程本地仓库artifactory搭建添加仓库使用本地仓库gradle插件仓库引入 插件buildSrc开发步骤xxxPluginPg…

五、DQL-2.基本查询

一、数据准备 1、删除表employee&#xff1a; drop table employee; 2、创建表emp&#xff1a; 3、添加数据&#xff1a; 4、查看表数据&#xff1a; 【代码】 -- 查询数据--------------------------------------------------------- drop table emp;-- 数据准备-----------…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大&#xff0c;通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 &#xff0c;正则表达式 包括子目录 ls 不包括 子目录 如果省略路径&#xff0c;表示 在当前路径下&#xff0c;搜索 软链接…

LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统

LabVIEW开发航空电子设备嵌入式诊断半物理仿真系统 航电集成系统是现代战争飞机的重要组成部分&#xff0c;包括惯性导航系统、飞行控制系统、机电管理系统和任务计算机等子系统。战机的作战性能与航电系统息息相关&#xff0c;可以说&#xff0c;没有高性能的空电系统&#x…

【Python爬虫开发基础⑭】Scrapy架构(组件介绍、架构组成和工作原理)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a; ⭐️前面比较重要的基础内容&#xff1a; 【Python爬…

[pyqt5]QListView增删改查和添加右键菜单

将一批数据list加入到QListView slm QStringListModel() # 创建modelslm.setStringList([111, 222, 333]) # 将数据设置到modelself.listView.setModel(slm) 设置某行被选中&#xff0c;这里以第一行选中为例子 model_index slm.index(0, 0)self.listView.setCurrentIndex…

古代政府机构及官员品级

我国古代官员职位各历史阶段不同&#xff0c;分类繁多。 中央官制历史沿袭 战国时&#xff0c;各国国君之下设相与将&#xff0c;分掌文武权柄。我们熟知的例子有&#xff0c;赵慧文王以蔺相如为相&#xff0c;廉颇为将。但同时期楚国最高长官为令尹&#xff0c;武官是上柱国…

[QT编程系列-22]:基本框架 - QT常见数据结构:QString、QList、QVector、QMap、QHash、QSet、QPair快览

目录 1. QT常见数据结构概述 2. QList与QVector比较 3. QPair和QMap比较 4. QT数据结构与STL库数据结构比较 5. QT数据结构与STL库数据结构性能比较 1. QT常见数据结构概述 在Qt中&#xff0c;有几个主要的数据结构常用于处理和组织数据&#xff0c;包括&#xff1a; QS…

数据库用户管理

数据库用户管理 一、创建&#xff1a; 1.新建用户&#xff1a; CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码];‘用户名’&#xff1a;指定将创建的用户名. ‘来源地址’&#xff1a;指定新创建的用户可在哪些主机上登录&#xff0c;可使用IP地址、网段、主机…

Docker 应用容器引擎

Docker 应用容器引擎 一、Docker是什么二、Docker安装和查看1、docker安装2、docker版本信息查看3、docker信息查看 三、镜像操作四、容器操作1、容器创建2、创建并启动容器3、容器的进入4、复制5、容器的导入和导出6、删除容器 一、Docker是什么 是一个开源的应用容器引擎&…

ROS:nodelet

目录 一、前言二、概念三、作用四、使用演示4.1案例简介4.2nodelet 基本使用语法4.3内置案例调用 五、nodelet实现5.1需求5.2流程5.3准备5.4创建插件类并注册插件5.5构建插件库5.6使插件可用于ROS工具链5.6.1配置xml5.6.2导出插件 5.7执行 一、前言 ROS通信是基于Node(节点)的…

【动手学深度学习】--15.含并行连结的网络GoogLeNet

文章目录 含并行连结的网络GoogLeNet1.Inception块2.GoogLeNet模型3.训练模型 含并行连结的网络GoogLeNet 学习视频&#xff1a;含并行连结的网络 GoogLeNet / Inception V3【动手学深度学习v2】 官方笔记&#xff1a;含并行连结的网络&#xff08;GoogLeNet&#xff09; 1.…

【云原生】容器镜像

v ljx97609760 一起沟通学习 容器镜像 容器镜像&#xff08;Image&#xff09;所承载的是封装了应用程序及其所有软件依赖的二进制数据。 容器镜像是可执行的软件包&#xff0c;可以单独运行 你通常会创建应用的容器镜像并将其推送到某仓库&#xff08;Registry&#xff09;&…

Appium-Python-Client 源码剖析 (一) driver 的元素查找方法

目录 前言 源码版本:0.9 结构图&#xff1a; mobileby.py appium 的 webdriver.py selenium 的 webdriver.py seleniumdriver appiumdriver 前言 Appium-Python-Client是一个用于Python语言的Appium客户端库&#xff0c;它提供了丰富的API和功能&#xff0c;用于编写和…

【LeetCode】594. 最长和谐子序列

594. 最长和谐子序列&#xff08;简单&#xff09; 方法&#xff1a;哈希表计数 思路 题目规定的「和谐子序列」中的最值差值正好为 1&#xff0c;因而子序列排序后必然符合[a,a,.., a 1,a1]形式&#xff0c;即符合条件的和谐子序列长度为相邻两数(差值为 1)的出现次数之和。…

国产单片机(沁恒微WCH)CH32V307评估板初探

国产单片机(沁恒微WCH)CH32V307评估板初探 关于沁恒微&#xff1a;国产芯厂家、官网链接 公司简介 - 南京沁恒微电子股份有限公司 (wch.cn) 开发板资源&#xff1a; 评估板应用于 CH32V307 芯片的开发&#xff0c;IDE 使用 MounRiver 编译器&#xff0c;可选择使用板载或独…