Problem
Given an array nums with n integers, your task is to check if it could become non-decreasing by modifying at most one element.
We define an array is non-decreasing if nums[i] <= nums[i + 1] holds for every i (0-based) such that (0 <= i <= n - 2).
Example 1:
1 | Input: nums = [4,2,3] |
Example 2:
1 | Input: nums = [4,2,1] |
Constraints:
n == nums.length1 <= n <= 104-105 <= nums[i] <= 105
Analysis
题目给出一个数组要求在允许修改一个数值的情况下,判断这个数组是不是非递减的。从前往后遍历通过nums[i - 1] > nums[i]能判断出后面的数比前一个小,不符合题目的要求。
一开始我的想法是直接判断上面出现的情况的次数,如果出现的次数超过一次则返回false,但是其实是有问题的。比如[3, 4, 2, 3]这个数组,虽然只有4和2这一个地方满足了上面的条件,但实际上是不能通过只改变一个数字的值使得数组变成非递减的。因为无论把4修改成什么值,都无法做到。所以这里不能盲目地只判断出现的次数,还需要把实际更新的操作也做了,然后一直往后遍历下去。
如何更新数值就是这道题目的难点所在。以题目给出的Example1为例,应该是把4改成2,最后数组变成[2,2,3];再看另一个例子[-1,4,2,3],这里也是需要把4修改成为,最后数组变成[-1,2,2,3];最后看一个例子[2,3,3,2,4],这里并不是把3改成2,而是把2修改成3,最后数组变成[2,3,3,3,4]。通过这三个例子,可以发现,前两个例子都是把nums[i]修改为nums[i - 1],而最后一个例子是把nums[i - 1]修改成nums[i]。
是什么导致了上面两种不同的修改方式呢?是nums[i - 2]这个数。Example1是因为前面没有数字了,Example2是因为nums[i - 2] < nums[i],Example2是因为nums[i - 2] > nums[i],所以我们需要根据这个大小关系,选择不同的更新方法。
同时维护一个count值,初始化为1,当完成一次更新操作后,减1,如果后面还有更新操作,则说明不满足题目的意思,直接return false。
Solution
无。
Code
1 | class Solution { |
Summary
这道题目虽然看上去意思很简单,但是实际打起来还是涉及到了一些细节。这道题目的分享到这里,感谢你的支持!