每日一题力扣665

给你一个长度为 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
原文地址:https://www.cnblogs.com/liuxiangyan/p/14454593.html