• 刷爆力扣之非递减序列


    刷爆力扣之非递减序列

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

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

    请添加图片描述

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

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

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


    一 🏠 题目描述

    665. 非递减数列

    给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。

    我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]

    示例 1:

    输入: nums = [4,2,3]
    输出: true
    解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。
    
    • 1
    • 2
    • 3

    示例 2:

    输入: nums = [4,2,1]
    输出: false
    解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
    
    • 1
    • 2
    • 3

    提示:

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

    二 🏠破题思路

    2.1 🚀 关键信息

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

    ① 非递减数列,对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1] = 两两比较 🌹🌹🌹

    ② 在 最多 改变 1 个元素的情况下,整数数组 nums 能否变成非递减数列 = 循环跳出计数统计大于 1 🌸🌸🌸


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


    2.2 🚀 思路整理

    正向遍历法

    依据上述关键信息知,在数组遍历过程中两两比较,直至到达末尾或计数统计大于一结束循环

    对于两两比较,若 nums[i - 1] > nums[i] 说明前者大于后者,不满足非递减数列,将计数统计加加

    此时考虑更改 nums[i - 1]nums[i] 的值,分为以下两种情况

    ① 当 i >= 2 && nums[i - 2] > nums[i] 时,即 nums[i] 小于前前者的数值时,只能将 nums[i] 更改才可满足非递减数列的条件

    ② 其余情况,则只需更改 nums[i - 1] 即可满足非递减数列的条件

    注:在更改元素时,将优先把元素更改至可选范围内的最小,以尽可能满足非递减数列的条件 🌺🌺🌺


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


    三 🏠 代码详解

    3.1 🚀 代码实现

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

    bool checkPossibility(vector& nums) {
            size_t len = nums.size(); //获取数组长度
            size_t count = 0; //计数统计
    
            for (size_t i = 1; i < len && count < 2; ++i) { //遍历数组
                if (nums[i - 1] > nums[i]) { //两两比较, 若前者大于后者
                    ++count; //将计数统计加加
                    if (i >= 2 && nums[i - 2] > nums[i]) nums[i] = nums[i - 1]; //若第三个数小于第一个数,则必须改变第二个数
                    else nums[i - 1] = nums[i];
                }
            }
    
            return count <= 1; //判断计数统计是否符合条件
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.2 🚀 细节解析

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

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

    i < len && count < 2 //循环结束的条件
    
    • 1

    在数组遍历过程中两两比较,直至到达末尾或计数统计大于一结束循环 🐌🐌🐌


    if (i >= 2 && nums[i - 2] > nums[i]) ...
    
    • 1

    在数组遍历过程中两两比较,若前者大于后者需再进行上述 if 。其意义当前值已经小于上一个值,判断当前值是否小上上一个值,因在更改元素时,需将优先把元素更改至可选范围内的最小 🐳🐳🐳


    四 🏠 心路历程

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

    博主在第一阶段提取 🚀 关键信息没有问题,在第二阶段 🚀 思路整理也没有问题(上述实现和题解博主原创)


    五 🏠 结语

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

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

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

  • 相关阅读:
    Scratch软件编程等级考试二级——20210911
    Salesforce-Visualforce-5.标准列表控制器(Standard List Controllers)
    python算法例14 整数加法
    java毕业生设计心灵治愈服务平台计算机源码+系统+mysql+调试部署+lw
    Electron桌面应用开发:从入门到发布全流程解析
    Docker - 私有云、数据卷、网络
    Stored Procedure && Trigger
    化工单元操作复习题(含答案)
    Hadoop集群安装
    Revit SDK:CreateFillPattern 创建填充样式
  • 原文地址:https://blog.csdn.net/qq_44868502/article/details/128200397