leetcode——非递减数列

题目序号:

665

题目 :

给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。

分析:

已知最终得到的数据每一项一定大于等于前一项,即:
n u m s [ i − 1 ] < = n u m s [ i ] < = n u m s [ i + 1 ] , 0 < i < l e n ( n u m s ) − 1 nums[i-1]<=nums[i]<=nums[i+1],0<i<len(nums)-1 nums[i1]<=nums[i]<=nums[i+1],0<i<len(nums)1
所有我们需要把数组中的每一个相邻的三个数满足这样的条件:
然而不符合的相邻三个数共有这样的三种形式:

  1. n u m s [ i − 1 ] < n u m s [ i + 1 ] < n u m s [ i ] nums[i-1]<nums[i+1]<nums[i] nums[i1]<nums[i+1]<nums[i]
  2. n u m s [ i + 1 ] < n u m s [ i − 1 ] < n u m s [ i ] nums[i+1]<nums[i-1]<nums[i] nums[i+1]<nums[i1]<nums[i]
  3. n u m s [ i + 1 ] = n u m s [ i − 1 ] < n u m s [ i ] nums[i+1]=nums[i-1]<nums[i] nums[i+1]=nums[i1]<nums[i]

为了方便所示,我们用图来表示:
在这里插入图片描述
为了得到非递减数列,我们需要对每组相邻三数进行改变,这里我们保证不对后面数据改变的前提下,对其进行局部最优的改变。

  1. n u m s [ i ] = n u m s [ i + 1 ] nums[i] = nums[i+1] nums[i]=nums[i+1]
  2. n u m s [ i + 1 ] = n u m s [ i ] nums[i+1] = nums[i] nums[i+1]=nums[i]
  3. n u m s [ i ] = n u m s [ i + 1 ] ( n u m s [ i − 1 ] ) nums[i] = nums[i+1](nums[i-1]) nums[i]=nums[i+1](nums[i1])

改变后如图所示:
在这里插入图片描述
ps:这里我们这里我们可以将1,3情况合并。

我们可以发现,每个三元数组只会改变第二个第三个数据,所以我们只需要在数列的开头补一个小于等与数组第一个数的数字即可。

题目要求这样的有效操作最多为1次,所以对有效操作计数即可。

代码部分

class Solution:
    def checkPossibility(self, nums: List[int]) -> bool:
        cnt = 0
        nums.insert(0,num[0])
        for i in range(1, len(nums)-1):
            if nums[i]>=nums[i-1] and nums[i]>nums[i+1] :
                if nums[i+1]>= nums[i-1]:
                    nums[i] = nums[i+1]
                else:
                    nums[i+1] = nums[i]
                cnt+=1
            if cnt>1:
                return False
        if cnt <= 1:
            return True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值