刷爆力扣之最长连续递增序列
创始人
2024-03-21 07:03:34

刷爆力扣之最长连续递增序列

HELLO,各位看官大大好,我是阿呆 🙈🙈🙈

今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜

请添加图片描述

该专栏按照不同类别标签进行刷题,每个标签又分为 Easy、Medium、Hard 三个等级 👊👊👊

本部分所有题目均来自于LeetCode 网,并于每道题目下标明具体力扣网原题链接 🏃🏃🏃

OK,兄弟们,废话不多直接上题,冲冲冲 🌞🌞🌞


一 🏠 题目描述

674. 最长连续递增序列

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 lrl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109

二 🏠破题思路

2.1 🚀 关键信息

解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎

一个未经排序的数组,找到最长且 连续递增的子序列,并返回该序列的长度

看到连续就应该联想到前者比较后者的逻辑,递增规定了序列的比较条件 🌹🌹🌹


提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃


2.2 🚀 思路整理

贪心法

使用贪心策略得到尽可能长的连续递增序列

记录当前连续递增序列开始下标和结束下标,遍历数组的过程中每次比较相邻元素,根据相邻元素的大小关系决定是否需要更新连续递增序列的开始下标 🌺🌺🌺


具体流程,令 start 表示连续递增序列的开始下标,初始时 start = 0,然后遍历数组 nums,进行如下操作

① 如果下标 i > 0nums[i−1] >= nums[i],则说明当前元素小于或等于上一个元素,因此 nums[i−1]nums[i] 不属于同一个连续递增序列,必须从下标 i 处开始一个新的连续递增序列,因此令 start=i。

② 如果下标 i = 0nums[i] > nums[i−1],则不更新 start 的值。此时下标范围 [start , i] 的连续子序列是递增序列,其长度为 i − start + 1,使用当前连续递增序列的长度更新最长连续递增序列的长度

遍历结束之后,即可得到整个数组的最长连续递增序列的长度 🌺🌺🌺


🌸🌸🌸

整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃


三 🏠 代码详解

3.1 🚀 代码实现

按照我们刚才的破题思路,直接代码走起来 👇👇👇👇

int findLengthOfLCIS(std::vector& nums) {int res = 0; //定义最长且连续递增的子序列int n = nums.size(); //获取输入数组长度int start = 0; //定义连续递增子序列的起始索引for (int i = 0; i < n; i++) {  //遍历数组if (i > 0 && nums[i - 1] >= nums[i]) {  //i > 0, 处理 i = 0 特殊情况(仅一个元素)start = i; //当出现不满足连续递增情况时, 更新 start}res = max(res, i - start + 1);  //不断更新连续递增子序列长度}return res; //返回结果
}

3.2 🚀 细节解析

看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃

那么我们挖掘上述实现的晦涩细节 😖😖😖 进行解析,直接开干,走起来 👇👇👇👇

if (i > 0 && nums[i - 1] >= nums[i]) ... //处理 i = 0 特殊情况

判决条件中的 i > 0 处理了 i = 0 的特殊情况 🐌🐌🐌


res = max(res, i - start + 1);  //不断更新连续递增子序列长度

不断获取最优解是贪心算法的核心点,常规解决方式需要判断结尾特殊情况,而该实现很巧妙的将对序列遍历过程的操作进行了统一,代码很简洁 🐳🐳🐳


四 🏠 心路历程

为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈

博主在第一阶段提取 🚀 关键信息没有问题,在第二阶段 🚀 思路整理未联想到贪心算法

代码实现使用了常规解法,代码效率还 OK,但简洁性差 😭😭😭 ,代码如下 👇👇👇👇

 int findLengthOfLCIS(vector& nums) {int startIndex = -1, res = 0, len = nums.size();for (int i = 1; i < len; ++i) { //从 1 - len 遍历数组if (nums[i - 1] < nums[i] && startIndex == -1) { //如果前一个小于后一个且为递增序列的开始startIndex = i - 1;//记录下开始位置} else if (nums[i - 1] >= nums[i] && startIndex != -1) { //如果前一个大于等于后一个且为递增序列的结束res = std::max(res, i - startIndex); //记录下递增序列的长度startIndex = -1; //并将起始位置重新置为 0} if (nums[i - 1] < nums[i] && i == len - 1) { // 结尾一批数据的输出res = std::max(res, i - startIndex + 1); //记录下递增序列的长度}}return res == 0 ? 1 : res; //处理无递增序列的特殊情况}

五 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

如果各位看官大大觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...