给定一个长度为 n
的整数数组,你的任务是判断在最多改变 1
个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i
(1 <= i < n),满足 array[i] <= array[i + 1]
。
示例 1:
输入: [4,2,3] 输出: True 解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。
示例 2:
输入: [4,2,1] 输出: False 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
说明: n
的范围为 [1, 10,000]。
思路:
如果数 i 小于数 i - 1,则需要调整:调整次数为1
调整策略:根据 数 i 与 数 i - 2 的有无及大小情况决定
1、不存在数 i - 2 :可以使 数 i - 1 等于 数 i
2、存在数 i - 2 :
若 数 i 大于或等于 数 i - 2:使 数 i - 1 等于 数 i
若 数 i 小于 数 i - 2:使 数 i 等于 数 i - 1
class Solution:
def checkPossibility(self, nums: 'List[int]') -> 'bool':
count = 1
for i in range(1, len(nums)):
if nums[i] < nums[i - 1]:
if count == 0:
return False
if i == 1 or nums[i] >= nums[i - 2]:
nums[i - 1] = nums[i]
else:
nums[i] = nums[i - 1]
count -= 1
return True
if __name__ == '__main__':
s = Solution()
# nums = [3, 4, 2, 3]
# nums = [4, 2, 3]
nums = [-1, 4, 2, 3]
print(s.checkPossibility(nums))