leetcode-030-非递减数列
刷题之旅从数组类型的题目开始。第三十道题目是非递减数列,对应leetcode的题号为665。
题目描述
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。
示例 1:
1 | 输入: [4,2,3] |
示例 2:
1 | 输入: [4,2,1] |
说明: n 的范围为 [1, 10,000]。
解题思路
只调整一次元素就成为非递减序列?我们考虑简单情况,比如示例的[4,2,3],此时我们知道只需要调整4即可,比如[2,2,3]即可满足非递减序列要求,那么这个序列是符合条件的。但是[4,2,1]就不行,按照刚才的做法,第一步是[2,2,1],但是此时第二个元素还是大于第三个元素,因此还要调整一次才符合,那么这个序列就不符合条件。
显然,这里的关键点是判断前一个元素是否大于后一个元素。一旦有此时就需要进行调整了。
不过如何调整呢?这里就稍微要注意点了,分为两种情况。以[i-1,i.i+1]为例,此时i处元素大于i+1处元素的:
- 当i-1大于i+1元素的时候,比如[3,4,1]这里的策略是将1调整为4(这是比较简单的调整策略,调整为5的话可能会加重后续的调整),调整之后变成[3,4,4]即可满足
- 当i-1小于i+1元素的时候,比如[1,4,3]这里策略是将4调小为3,变成[1,3,3]即可满足条件
具体见代码。
提交代码
1 | class Solution { |