给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-decreasing-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
错解
对不起我是智障
class Solution: def checkPossibility(self, nums: List[int]) -> bool: N=len(nums) if N<=2: return True count=0 for i in range(N): if i==0 and nums[i]>nums[i+1]: count+=1 nums[i+1]=nums[i] elif nums[i]>nums[i+1] and nums[i]>nums[i-1]: count+=1 nums[i+1]=nums[i] elif nums[i]>nums[i+1] and nums[i]<nums[i-1]: count+=2 nums[i]=nums[i-1] nums[i+1]=nums[i-1] return count<=1
正解
大概意思就是多写几个例子出来
如果i<i-1,确实要调整,但如果i还<i-2的话(前面的都拍好顺序了,i-1和i-2的顺序是对的),也就是说有i<i-2<i-1,如 3 5 2那么只能靠i自己做最大的老大了,单不知道后面的数如何,所以把2调整成5比较保险
如果i<i-1,确实要调整,但如果i还>i-2的话,如3 5 4,此时把4调整成5或者把5调整成4都是比较好的选择,优先把前面的数调小,所以这里最好调整5为3
有种情况就是没有i-2的时候,也就是i<2即代码中i==1的时候,这种情况就只能吧i调成i-1比较好
class Solution: def checkPossibility(self, nums: List[int]) -> bool: N=len(nums) if N<=2: return True count=0 for i in range(1,N): if nums[i]<nums[i-1]:#如果该数小于前一个数,需要调整,所以加一,每次遍历一个数,所以只加1 count+=1 if i==1 or nums[i]>nums[i-2]: nums[i-1]=nums[i] elif nums[i]<nums[i-2]: nums[i]=nums[i-1] return count<=1