求数组中前k个递增和后k个递减的问题

312周赛H6190

当我知道这一题的解法后,三分钟就能写出代码并通过,但是在我没有看灵佬的视频之前对这种题目毫无印象,好像从来没有写过这种题目,完全不知道从何下手,最后只好暴力,不必说,超时了。

判断一个数组中,最长连续递增(这里是非递减)的长度是多少的问题,另一类还有比如判断第i个数前面有多少个数连续递增,第i个数后面有多少个连续的数递减

以上面的周赛题目为例,可以用递推先保存下第i个数前面有几个数非递增
具体如下,对于一个数组 a = [1, 2, 2, 2, 4, 3],一共6个数,对于第0个数1,以1结尾的连续非递减的数就只有它自己一个,所以 t = [1],对于第二个数,1<2所以 t = [1, 1],但是对于第三个数,2 == 2,所以 t = [1, 1, 2],可以一直推出一个长度为n的数组t,t[i]就是a中以第i个数结尾的数连续非递减的长度,只有他自己时就是1,同理倒着走可以得到以第i个数开始的连续非递减的数组的长度,具体代码如下:

def goodIndices(nums: List[int], k: int) -> List[int]:
    n = len(nums)
    if k==1:
        return [i for i in range(1,n-1)]

    # 记录以第i个数结尾的最长的非递增数组的长度!
    left = [1]*n
    for i in range(1,n):
        if nums[i]<=nums[i-1]:
            left[i] = left[i-1]+1

    # 记录以第i个数开始的最长的非递减数组的长度!
    right = [1]*n
    for i in range(n-2,-1,-1):
        if nums[i]<=nums[i+1]:
            right[i] = right[i+1]+1

    # 遍历,找到前后都符合要求的数的索引
    ans = []
    for i in range(k,n-k):
        # 注意判断的是i的前一个和后一个,并不包括i
        if left[i-1]>=k and right[i+1]>=k:
            ans.append(i)
    return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值