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 | /** |