刷爆力扣之非递减序列

简介: 刷爆力扣之非递减序列

一 🏠 题目描述

665. 非递减数列


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


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

nums[i] <= nums[i +1]。


示例 1:


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

示例 2:


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

提示:


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<int>& 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; //判断计数统计是否符合条件
    }


3.2 🚀 细节解析

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


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


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

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



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

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



四 🏠 心路历程

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


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


相关文章
|
3月前
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
39 0
|
6月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
6月前
|
算法 安全 测试技术
[组合数学]LeetCode:2954:统计感冒序列的数目
[组合数学]LeetCode:2954:统计感冒序列的数目
|
6月前
|
算法 测试技术 C#
【单调栈】LeetCode2030:含特定字母的最小子序列
【单调栈】LeetCode2030:含特定字母的最小子序列
|
3月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
29 6
|
3月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
22 3
|
3月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
25 3
|
3月前
|
算法 Python
【Leetcode刷题Python】300. 最长递增子序列
LeetCode 300题 "最长递增子序列" 的两种Python解决方案:一种使用动态规划,另一种使用贪心算法结合二分查找。
36 1
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
42 0
|
3月前
|
Python
【Leetcode刷题Python】674. 最长连续递增序列
LeetCode 674题 "最长连续递增序列" 的Python解决方案,使用动态规划算法找出给定整数数组中最长连续递增子序列的长度。
94 0