mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-24 10:37:33 +08:00
31 lines
910 B
Go
31 lines
910 B
Go
package leetcode
|
||
|
||
func shortestSubarray(A []int, K int) int {
|
||
res, prefixSum := len(A)+1, make([]int, len(A)+1)
|
||
for i := 0; i < len(A); i++ {
|
||
prefixSum[i+1] = prefixSum[i] + A[i]
|
||
}
|
||
// deque 中保存递增的 prefixSum 下标
|
||
deque := []int{}
|
||
for i := range prefixSum {
|
||
// 下面这个循环希望能找到 [deque[0], i] 区间内累加和 >= K,如果找到了就更新答案
|
||
for len(deque) > 0 && prefixSum[i]-prefixSum[deque[0]] >= K {
|
||
length := i - deque[0]
|
||
if res > length {
|
||
res = length
|
||
}
|
||
// 找到第一个 deque[0] 能满足条件以后,就移除它,因为它是最短长度的子序列了
|
||
deque = deque[1:]
|
||
}
|
||
// 下面这个循环希望能保证 prefixSum[deque[i]] 递增
|
||
for len(deque) > 0 && prefixSum[i] <= prefixSum[deque[len(deque)-1]] {
|
||
deque = deque[:len(deque)-1]
|
||
}
|
||
deque = append(deque, i)
|
||
}
|
||
if res <= len(A) {
|
||
return res
|
||
}
|
||
return -1
|
||
}
|