665. 非递减数列
665. 非递减数列
一、题目描述
给你一个长度为n的整数数组,请你判断在 最多 改变1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的:对于数组中任意的i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
二、解题思路
既然是非递减数列,那么就从左到右遍历数组,维护一个前面遍历过的最大值 prev,当前值 nums[i],下一个值 next。
- 若
nums[i] < prev,因为要求是非递减的,那么nums[i]是一定要修正,至少要修正到nums[i] = prev; - 若
prev <= nums[i] <= next,属于正常情况,那么中值是不用修正的,直接更新prev = nums[i]; - 若
prev <= nums[i] && nums[i] > next,也就是中值比两边值都大,这个时候就需要分成2种情况:一种是prev <= next,这时候只需要修正中值nums[i] = prev就行了;另一种是prev > next,这个时候修正中值是没办法满足非递减要求的,只能修正next的值。
同时,为了保证 prev 和 next 一直存在,就给数组左右两边分别添加了额外的最小最大值,即整数的最小最大值。
三、复杂度分析
- 时间 O(n)
- 空间 O(1)
四、参考代码
1 | /** |