LeetCode 665.非递减数列

简介: LeetCode 665.非递减数列

665.非递减数列


思路

首先要明确最多只能修改一个元素。当元素呈现递减趋势时需要修改,而当递减数组大小超过2时,例如 [ 3 , 2 , 1 ] ,至少要修改2次不符合题意。但这样做还不够

本题唯一的易错点就在这,


如果将nums[i]缩小,可能会导致其无法融入前面已经遍历过的非递减子数列;

如果将nums[i + 1]放大,可能会导致其后续的继续出现递减;


所以要每次连续看3个元素,所谓瞻前顾后:


需要尽可能不放大nums[i + 1],这样会让后续非递减更困难;

如果缩小nums[i],但不破坏前面的子序列的非递减性;


代码实现

class Solution
{
public:
    bool checkPossibility(vector<int> &nums)
    {
        if (nums.size() == 1)
            return true;
        bool flag = nums[0] <= nums[1] ? true : false; // 标识是否还能修改
        // 遍历时,每次需要看连续的三个元素
        for (int i = 1; i < nums.size() - 1; i++)
        {
            if (nums[i] > nums[i + 1]) // 出现递减
            {
                if (flag) // 如果还有修改机会,进行修改
                {
                    if (nums[i + 1] >= nums[i - 1]) // 修改方案1
                        nums[i] = nums[i + 1];
                    else // 修改方案2
                        nums[i + 1] = nums[i];
                    flag = false; // 用掉唯一的修改机会
                }
                else // 没有修改机会,直接结束
                    return false;
            }
        }
        return true;
    }
};
目录
相关文章
|
1月前
Leetcode第38题(外观数列)
LeetCode第38题要求生成外观数列的第n项,该数列从数字1开始,每一项都是对前一项的描述,例如第1项是"1",第2项是"11",第3项是"21",以此类推。
27 0
|
3月前
|
存储
LeetCode------斐波那契数列(2)
这篇文章提供了解决LeetCode上"斐波那契数列"问题的两种方法:一种是使用备忘录模式通过递归计算并存储结果以避免重复计算,另一种是自底向上的迭代方法,同时要求结果对1e9+7取模。
LeetCode------斐波那契数列(2)
|
6月前
|
算法 测试技术 C#
前缀和+单调双队列+贪心:LeetCode2945:找到最大非递减数组的长度
前缀和+单调双队列+贪心:LeetCode2945:找到最大非递减数组的长度
|
6月前
leetcode-38:外观数列
leetcode-38:外观数列
41 0
|
算法 安全 Swift
LeetCode - #38 外观数列
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #38 外观数列
【leetcode每日一题】1027. 最长等差数列
【leetcode每日一题】1027. 最长等差数列
leetcode剑指offer53–n-1中缺失的数字(二分//or等差数列)
leetcode剑指offer53–n-1中缺失的数字(二分//or等差数列)
|
Java C语言
LeetCode刷题计划——单调数列
LeetCode刷题计划——单调数列
|
存储 Python
LeetCode 38. 外观数列
给定一个正整数 n ,输出外观数列的第 n 项。
95 0
LeetCode 1502. 判断能否形成等差数列
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
103 0