题目:
一个长度为 n 的整数数组,在最多改变1个元素的情况下,该数组能否变成一个非递减数列: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
思路:
非递减数列,也就是后面的数要大于等于前面,有一个则计数加一
所以:count=0,天然是非递减数列,返回ture
count>1,返回False
对于count=0的情况,要分类讨论(也主要卡在这里开始写的时候)
情况一:[5,4,6,7]第一个数大于第二个,后面是正常的递增,解决办法:把第一个数改成和第二个一样,返回true,即:
if i == 0: nums[i] = nums[i + 1]
情况二:[3,4,2,5],数字4这里有问题,且4前面的数3大于4后面的数2,这时2改成4即可:
if nums[i - 1] > nums[i + 1]: nums[i + 1] = nums[i]
情况三:[-1,4,2,3],数字4有问题,但4前面的数-1小于4后面的数2,这时4改成2即可:
nums[i] = nums[i + 1]
再举一个count>2的例子:[3,4,2,3]
i=0,pass
i=1时,count +1= 1 符合nums[i - 1] > nums[i + 1],那么nums[i + 1] = nums[i],即变成[3,4,4,3];
i=2时,4>3,count+1=2,False
完整代码如下:
class Solution:
def checkPossibility(self, nums):
count = 0
for i in range(len(nums) - 1):
if nums[i] > nums[i + 1]:
count += 1
if count > 1:
return False
if i == 0:
nums[i] = nums[i + 1]
print(nums)
else:
if nums[i - 1] > nums[i + 1]:
nums[i + 1] = nums[i]
print(nums)
else:
nums[i] = nums[i + 1]
print(nums)
else:
pass
return True
#测试
s = Solution()
m = s.checkPossibility([5,4,6,7])
l = s.checkPossibility([3,4,2,5])
k = s.checkPossibility([-1,4,2,3])
n = s.checkPossibility([3,4,2,3])
print(m)
print(l)
print(k)
print(n)
结果演示: