其他分享
首页 > 其他分享> > LeetCode 每日一题 :665. 非递减数列

LeetCode 每日一题 :665. 非递减数列

作者:互联网

本题题面如下所示:

 

思路:

  这道题目我一开始思考时想的比较简单,只是想到题目要求只能修改一处,所以整个序列中a[i]>a[i-1]的情况只能出现一次,因此直接遍历序列即可。提交错误后才发现这个要求并不是满足题目的充要条件,例如对于序列[3,4,1,2],它虽然满足上述条件,却不满足题意。

  后来经过仔细思考,考察时因为要确定当出现逆序情况时应该,修改哪个数据,所以仅仅考察相邻的两个元素是无法得出结论的。在这道题目中假设目前出现了a[i]>a[i-1],则还需要向前考察一位,即a[i-2],并比较a[i-2]与a[i]的关系。

在进行考察时要优先考虑修改前一个元素,因为要保证修改次数尽量少。如果修改后一个元素,则会影响到后续比较。如果a[i-2]<=a[i],那么此时就可以直接修改前一个元素,不过因为修改前一个元素对后续序列没有影响,因此在代码中这一部分不需要体现出来。如果是a[i-2]>a[i],此时修改前一个元素将无法满足题意(例如上面列举的特例),因此这种情况必须修改后一个元素,但同时要保证对后续序列产生的影响尽量小(即将后一个元素增加量最小化),所以将后一个元素修改为等于前一个元素即可。

代码:

class Solution:
    def checkPossibility(self, nums: List[int]) -> bool:
        count=1
        for i in range(1,len(nums)):
            if nums[i]<nums[i-1]:
                count-=1
                if count<0:
                    return False
                if i>1 and nums[i-2]>nums[i]:
                    nums[i]=nums[i-1]
        return True


 

标签:题目,数列,nums,665,元素,修改,考察,序列,LeetCode
来源: https://blog.csdn.net/qq_41461410/article/details/113746999