給定一個長度爲 n 的整數數組,你的任務是判斷在最多改變 1 個元素的情況下,該數組能否變成一個非遞減數列。
我們是這樣定義一個非遞減數列的: 對於數組中所有的 i (1 <= i < n),滿足 array[i] <= array[i + 1]。
示例 1:
輸入: [4,2,3]
輸出: True
解釋: 你可以通過把第一個4變成1來使得它成爲一個非遞減數列。
示例 2:
輸入: [4,2,1]
輸出: False
思路:先遍歷一遍列表,找出第一個不滿足的位置進行修改,當前位置i,則修改規則爲:
- 如果i-1 > i+1,則i+1處的值太小,設置爲i處相同
- 如果i-1 < i+1,則i處的值太大,設置爲i+1處相同
之後再判斷列表是否是非遞減的。
class Solution(object):
def checkPossibility(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
# 調整一次
for i in range(len(nums)-1):
if nums[i] > nums[i+1]:
if i == 0:
nums[i] = nums[i+1]
elif nums[i-1] > nums[i+1]: # i處後一位數太小了,加大
nums[i+1] = nums[i]
else:
nums[i] = nums[i+1] # i處太大了,變小
break
# 調整後再判斷
for i in range(len(nums)-1):
if nums[i] > nums[i+1]:
return False
return True