当我知道这一题的解法后,三分钟就能写出代码并通过,但是在我没有看灵佬的视频之前对这种题目毫无印象,好像从来没有写过这种题目,完全不知道从何下手,最后只好暴力,不必说,超时了。
判断一个数组中,最长连续递增(这里是非递减)的长度是多少的问题,另一类还有比如判断第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