一、题目
给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。
子数组 是数组中 连续 的一部分。
来源:力扣
二、思路
- 使用
前缀和的差
来计算子数组的和;- 使用一种数据结构,将
当前前缀和i
与最前面的前缀和j
作差,如果满足>=k的条件,那么j
在之后就可以不用看了。【因为即使后面也有满足条件的,长度也会更长,所以需要将j从前面弹出】;(优化一)- 第2步完成了之后,当前的i也要放入数据结构,那么如果数据结构中有
前缀和j
比前缀和i
大,j也可以不用看了。【因为即使后面有满足条件的,与i作差肯定也满足条件,并且长度更短,所以需要将大于等于i的从后面弹出】(优化二)
三、代码
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
def main(nums,k):
L = len(nums)
compare = []
gride = []
a = []
s=0
for x in range(L):
sumn = 0
sums = 0
for y in range(x + 1, L):
A = nums[y]
sums = A + sums
sumn = sums + nums[x]
if sumn >= k:
gride.append((x, y))
break
if nums[x]>=k:
a.append(1)
if x == L - 1 :
for i in gride:
a.append(i[1] - i[0] + 1)
if a:
return min(a)
for i in range(L):
s=nums[i]+s
if s<k and i == L-1:
return -1
elif s>=k:
break
if L==1:
if nums[0] < k:
return -1
else:
return 1
自己写的没有进行优化,大容量计算无法执行