leetcode刷题(5): STL的使用

文章目录

    • 56. 合并区间
      • 解题思路
      • c++实现
    • 55. 跳跃游戏
      • 解题思路
      • c++ 实现
    • 75. 颜色分类
      • 解题思路
      • c++ 实现
    • 36 下一个排列
      • 解题思路
      • c++ 实现

56. 合并区间

题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例:
在这里插入图片描述

解题思路

  • 首先利用sort对区间起点排序
    在这里插入图片描述

  • 每次取连续的区间查看是否相交,若相加合并。若无相交,由于按照起点排序,后面区间的起点更大,也就不可能再有相交的可能。
    在这里插入图片描述

c++实现

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if (intervals.size() <2) return intervals;sort(intervals.begin(),intervals.end());vector<int> tmp = intervals[0];vector<vector<int>> ans;for(int i=1;i<intervals.size();i++){if (tmp[1]>=intervals[i][0]){// 合并区间tmp[0] = min(tmp[0],intervals[i][0]);tmp[1] = max(tmp[1],intervals[i][1]);//  ans.push_back(tmp);  //注意不要写这句}else{// 区间不相交,则将tmp放入答案// 然后tmp 等于当前元素ans.push_back(tmp);tmp = intervals[i];}}// 记得把最后一个区间放入答案ans.push_back(tmp);return ans;}
};
  • 对比连续的两个区间,如果重叠则合并两个区间
  • 如果区间不相交,则将前一个区间tmp加入答案中, 并更新tmp区间为当前元素
  • 记得把最后一个区间放入答案

55. 跳跃游戏

题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃最大长度

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

示例:
在这里插入图片描述

解题思路

  • 每次跳跃可到达的最远距离canreach,可用如下公式表示:
int currPos =0;  // 假设当前位置为0
int canreach = currPos + nums[curPos];
  • 第一次跳跃达到最远距离为canreach, 接着从第二个格子到canreach范围内跳跃,每次跳跃更新canreach的值,保存最大的canreach。
  • 如果最大的canreach超出(≥)格子范围,则返回true, 否则返回false

参考: https://www.cnblogs.com/itdef/p/16675994.html

c++ 实现

class Solution {
public:bool canJump(vector<int>& nums) {int curPos =0;int canreach = curPos + nums[curPos];for(;curPos<canreach;curPos++){if (curPos>=nums.size()-1)  return true;canreach = max(canreach,curPos + nums[curPos]);}if (canreach >= nums.size()-1) return true;return false;}
};

75. 颜色分类

题目: 给定一个包含红色白色蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数0、 1 和 2分别表示红色、白色和蓝色

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例:
在这里插入图片描述

  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

解题思路

  • 使用整数0、 1 和 2分别表示红色、白色和蓝色, 也就是给我们一个由0,1,2数字组成的数组,需要我们对其原地进行排序
  • 最基本最朴素的想法是使用如下sort 排序,很明显题目要求不能使用库函数sort来排序, 它的时间复杂度为nlog(n), 但题目要求一趟扫描算,也就是实现O(n)时间复杂度:
sort(nums.begin(),nums.end());
  • 对题目分析可知,不管怎样排序,最终的结果都是: 所有为0元素排在数组最左边,所有为2元素排在数组最右边,剩下所有1排数组的中间
  • 可以设置两个边界:left和right。 边界left的左边全部为0,边界right右边为2, left 和right中间部分全为1
    在这里插入图片描述
  • 可以通过两次扫描第一次扫描,将全部0元素放在数组最左边,第二次扫描将所有1元素紧接着0元素放置,剩下的位置就是元素2

c++ 实现

class Solution {
public:void sortColors(vector<int>& nums) {int l=0,r=0;//(1) 将所有0元素 移动到数组最左边for(r=0;r<nums.size();r++){if (nums[r] ==0){swap(nums[r],nums[l]);l++;}}//(2) 将所有1元素,移动到所有0元素之后//  此时剩余的最右边的元素只有2了for(r=0;r<nums.size();r++){if (nums[r] ==1){swap(nums[r],nums[l]);l++;}}return ;}
};
  • 使用swap函数来调换元素,这样才能保证变换后素组中的元素是不变的,只是顺序变换了,切记不能使用=后来调换,这样不光改变顺序,同时会改变nums数组中的元素值,比如,如下错误写法:
  for(r=0;r<nums.size();r++){if (nums[r] ==0){nums[l++] = nums[r]}}for(r=0;r<nums.size();r++){if (nums[r] ==1){nums[l++] = nums[r]}}
  • 实现步骤(1) 将所有0元素 移动到数组最左边, 使用swap来调换顺序
  • 实现步骤(2) 将所有1元素,移动到所有0元素之后,使用swap来调换顺序

36 下一个排列

题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

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

示例:
在这里插入图片描述

解题思路

下一个排序,简而言之,就是找到一个最接近的一个比它大的数。通过观察规律可以发现:

  • 右向左找到第一个不符合升序的数字, 然后与从右向左找到第一个比它大的数字进行交换
  • 比如1234 找到第一个不符合升序的数字3,3比4小,再从右向左找一个比它大的数字4进行交换,变成1243即可。
  • 经过交换后数字比原来的数字排列大但未必是最接近的最小值,因为交换后右边数字是降序排列的,需要调整为升序排列,这样才能保证得到的是一个最接近它,比原来排列数字大的。
  • 例如 13 4 2 找到第一个不符合升序数字3,再找到交换的数字4,变换为 14 3 2, 这时候 3比2要大,还需要对4右边的数字,升序排列,1 4 2 3才是正解

c++ 实现

class Solution {
public:void nextPermutation(vector<int>& nums) {int i=0;for (i= nums.size()-2;i>=0;i--){   //(1) 逆序查找,找到第一个不符合的(从右往左)升序数字if(nums[i]<nums[i+1]){//(2) 再逆序查找,第一个比刚才的数字大的数字,进行交换for(int j=nums.size()-1;j>i;j--){if (nums[j]>nums[i]){swap(nums[i],nums[j]);//reverse(nums.begin()+i+1,nums.end());//(3) 交换完之后,将两交换数字右边的数字升序排列sort(nums.begin()+i+1,nums.end());return;}}}}if (i<0){reverse(nums.begin(),nums.end());return;}}
};
  • (1) 逆序查找,找到第一个不符合的(从右往左)升序数字
  • (2) 再逆序查找,第一个比刚才的数字大的数字,进行交换(注意不是前后两个数字交换), 比如:[1,3,2] ->[2,3,1]->[2,1,3]
  • (3) 交换完之后,将两交换数字右边的数字升序排列
    • 此时找到了最接近的比它大的数字,记得马上就return; 否则还会继续交换,得不到正确的结果
  • (4) 如果逆序遍历完,都没有发现不符合的升序数字,说明该数字排列本身就是最大的,此时根据题目要求需要返回最小的排列,使用reverse函数就可以实现。

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

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

相关文章

Linux(openEuler、CentOS8)企业内网samba服务器搭建(Windows与Linux文件共享方案)

本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验1. 安装samba2. 启动smb服务并设置开机启动3. 查看服务器监听状态4. 配置共享访问用户5. 创建共享文件夹6. 修改配置文件7. 配置防火墙8. 使用windows…

Hypack 2024 简体中文资源完整翻译汉化已经全部完成

Hypack 2024 简体中文资源完整翻译汉化已经全部完成 Hypack 2024&#xff0c;资源汉化共翻译11065条。毕竟涉及测绘、水文、疏浚等专业术语太多&#xff0c;翻译有很多理解不正确的地方&#xff0c;望各位专业人员指正。 压缩包内包含Hypack 2024、Hypack 2022、Hypack 2021、…

Autoxjs 实践-Spring Boot 集成 WebSocket

概述 最近弄了福袋工具&#xff0c;由于工具运行中&#xff0c;不好查看福袋结果&#xff0c;所以我想将福袋工具运行数据返回到后台&#xff0c;做数据统计、之后工具会越来越多&#xff0c;就弄了个后台&#xff0c;方便管理。 实现效果 WebSocket&#xff1f; websocket是…

Qt应用开发(拓展篇)——图表 QChart

一、前言 QChart是一个图形库模块&#xff0c;它可以实现不同类型的序列和其他图表相关对象(如图例和轴)的图形表示。要在布局中简单地显示图表&#xff0c;可以使用QChartView来代替QChart。此外&#xff0c;线条、样条、面积和散点序列可以通过使用QPolarChart类表示为极坐标…

Python的奇妙之旅——回顾其历史

我们这个神奇的宇宙里&#xff0c;有一个名叫Python的小家伙&#xff0c;它不仅聪明&#xff0c;而且充满活力。它一路走来&#xff0c;从一个小小的编程语言成长为如今全球最受欢迎的编程语言之一。今天&#xff0c;我们就来回顾一下Python的历史&#xff0c;看看它如何从一个…

字体设计_西文字体设计(英文字体设计)

一 西文字体设计基础知识 设计目标和历史成因 设计目标&#xff1a;让眼睛看着舒服的字体 那什么样的字体让眼睛看着舒服呢&#xff1f; 让眼睛看着舒服的字体造型其实是我们记忆里的手写体、自然造型。 所以就能理解西文字体为什么同一笔画&#xff0c;有的地方粗有的地方…

DDPM与扩散模型

很早之前就新建了一个专栏从0开始弃坑扩散模型 ,但发了一篇文章就没有继续这一系列&#xff0c;在这个AIGC的时代&#xff0c;于是我准备重启这个专栏。 整个专栏的学习顺序可以见这篇汇总文章 这是本专栏的第一章 目录 引言生成模型的发展历程 引言 扩散模型( Diffusion Mode…

52页 | 2024大型语言模型行业图谱研究报告(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 【2024大型语言模型行业图谱研究报告】 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT解…

STC8增强型单片机开发——库函数

一、使用库函数点灯 导入库函数。 下载STC8H的库函数&#xff1a;&#x1f4ce;STC8G-STC8H-LIB-DEMO-CODE_2023.07.17_优化版.zip 来到库函数的目录下&#xff0c;拷贝以下文件&#xff1a; Config.hType_def.hGPIO.hGPIO.c 新建项目&#xff0c;将拷贝的4个文件放到项目目录…

WEB基础--JDBC操作数据库

使用JDBC操作数据库 使用JDBC查询数据 五部曲&#xff1a;建立驱动&#xff0c;建立连接&#xff0c;获取SQL语句&#xff0c;执行SQL语句&#xff0c;释放资源 建立驱动 //1.加载驱动Class.forName("com.mysql.cj.jdbc.Driver"); 建立连接 //2.连接数据库 Stri…

【Android】Room数据库的简单使用方法

Room数据库的使用方法 目录 1、添加Room数据库的依赖2、Entity——定义实体类 2.1 定义主键——PrimaryKey2.2 字段注解——ColumnInfo 3、Dao——定义数据访问对象4、Database——数据库 4.1 通过回调观察数据库是否创建成功 5、使用时注意点6、编写异步 DAO 查询 6.1 写异步…

【CSS】认识CSS选择器及各选择器对应的用法

目录 一、什么是CSS&#xff1f; 二、CSS 选择器 1. 标签选择器 2. 类选择器 3. ID选择器 4. 通配符选择器 5. 复合选择器 一、什么是CSS&#xff1f; CSS(Cascading Style Sheet)&#xff0c;层叠样式表。它与 HTML&#xff08;超文本标记语言&#xff09;一起使用&am…

Django-新冠疫情数据分析系统-67684

目 录 摘要 1 绪论 1.1 研究背景 1.2论文结构与章节安排 2 新冠疫情数据分析系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析…

2024.5.8 2.二叉树的最大深度 (简单)

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输…

批量图片重命名及汇总

又一堆图片文件需要处理... 源文件分布&#xff1a; 有N个文件夹&#xff0c;每个文件夹下又有M个子文件夹&#xff0c;每个子文件夹下有X张图片。 例如文件夹A下有子文件夹A1,A2,A3&#xff0c;子文件夹A1下有图片a-1,a-2,a-3...... 处理目标&#xff1a; 1、将所有图片汇…

五月最新流行音乐网,整点干货(10个网站)听歌就要自由!

随着互联网的迅猛发展&#xff0c;音乐产业也迎来了前所未有的变革。如今&#xff0c;我们无需再依赖传统的唱片店或电台&#xff0c;就能轻松接触到来自世界各地的音乐。而“最新流行音乐网”正是这一变革的产物&#xff0c;为广大音乐爱好者提供了一个探索音乐潮流的新天地。…

将大概的流程具体还是看源码

之前看源码的时候呢没有文字整理&#xff0c;想来还是写一个大概的流程吧&#xff0c;具体是无法用文字描述 spring源码真的yyds&#xff0c;数据结构 反射 父子类 接口…玩得溜到飞起 博大精深呐 后期不断喜欢ing&#xff01; springApplication.run方法 获取了一个Configu…

无刷电机和有刷电机的区别

无刷电机和有刷电机的区别 无刷电机的定子上绕着线圈&#xff0c;线圈通常是成对出现的&#xff0c;通过控制电路为每一对线圈按照一定顺序输入电流&#xff0c;就可以产生旋转的磁场 它还有一个永磁体转子&#xff0c;现在多采用高磁能级的稀土铷铁硼材料&#xff0c;体积更小…

DBdoctor产品介绍

基本信息 DBdoctor是聚好看科技股份有限公司自主研发的一款数据库内核级性能诊断工具&#xff0c;首次将eBPF技术聚焦在了数据库领域&#xff0c;一分钟内定位数据库性能问题并给出优化建议&#xff0c;实现数据库性能诊断百倍提效。 免费下载 请在PC端打开以下链接&#x…

ps5电玩计时收费系统软件教程,电玩店适合的计时器,电脑定时语音提醒

ps5电玩计时收费系统软件教程&#xff0c;电玩店适合的计时器&#xff0c;电脑定时语音提醒 一、前言 以下软件操作教程以&#xff0c;佳易王电玩计时计费管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、计时计费功能&#xff1a;只…