LeetCode每日一题系列
题目:862. 和至少为 K 的最短子数组
难度:困难
题目
给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。
子数组 是数组中 连续 的一部分。
示例
示例 1:
输入:nums = [1], k = 1
输出:1
示例 2:
输入:nums = [1,2], k = 4
输出:-1
示例 3:
输入:nums = [2,-1,2], k = 3
输出:3
提示:
1 <= nums.length <= 105
-105 <= nums[i] <= 105
1 <= k <= 109
思路
自己想了半天的思路都是超时,然后去看了题解,顺便学习了单调队列的使用。
前缀和+单调队列(双端队列)
具体思路大家可以看这个题解大佬的题解
题解
class Solution:
def shortestSubarray(self, nums: List[int], k: int) -> int:
ans = inf
s = list(accumulate(nums, initial=0)) # 计算前缀和
q = deque()
for i, cur_s in enumerate(s):
while q and cur_s - s[q[0]] >= k:
ans = min(ans, i - q.popleft()) # 优化一
while q and s[q[-1]] >= cur_s:
q.pop() # 优化二
q.append(i)
return ans if ans < inf else -1