Day 30
Date: October 26, 2022 1:03 PM
LinkedIn: https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/description/
Title: 和至少为 K 的最短子数组
前缀和 + 单调队列(看半天题解才看懂,自己写的是滑动窗口+暴力,O(n^2)超时)
class Solution:
def shortestSubarray(self, nums: List[int], k: int) -> int:
s = list(accumulate(nums, initial=0)) # 默认初始值0,然后再依次累加前i项和,s[0] = 0
q = deque() # 单调递增队列
ans = inf
for i, v in enumerate(s):
while q and v - s[q[0]] >= k: # 寻找大于等于k的子数组 每次取队头也就是最小的s进行比较
ans = min(ans, i - q.popleft())
while q and s[q[-1]] >= v: # 如果队列中元素下标对应的s大于等于v 则出队最后一个,保持单调
q.pop()
q.append(i) # 入队下标
return -1 if ans == inf else ans
accumulate
(nums, op, initial=x)(op默认是累加,可自定义)
从初始值x开始进行对nums前i项进行op操作
默认是累加,函数可以将一个序列中的元素累积起来,返回一个新的序列。
用法:
例
nums = [1, 2, 3, 4, 5]
print(list(accumulate(nums))) # 默认加法累积:[1, 3, 6, 10, 15]
print(list(accumulate(nums,initial = 2))) # 默认加法累积:[2,3, 5, 8 , 12, 17]