思路: 采用滑動窗口
注意點
- 左邊移動的時候,如果去掉的數是負數,那么右邊游標要做回滾;
- 右邊的游標移動時,出現sum<=0,說明此次的計算沒有意義,不要再進行下去;
代碼
func shortestSubarray(A []int, K int) int {
lA := len(A)
sum := 0
j := 0
minL := -1
for i := 0; i < lA; i++ {
if i >= 1 {
sum -= A[i-1]
// 回滾, 如果刪的是負數
if A[i-1] < 0 {
for ; ; {
if j >i {
sum -= A[j-1]
j --
if sum >= K {
min := j - i
if minL == -1 || (minL != -1&& min < minL) {
minL = min
}
}
} else {
break
}
}
}
}
// 此時夠的,那么計算最小
if sum >= K {
min := j - i
if minL == -1 || (minL != -1&& min < minL) {
minL = min
}
continue
}
for {
if j >= lA || sum < 0 {
break
}
sum += A[j]
j ++
if sum >= K {
min := j - i
if minL == -1 || (minL != -1&& min < minL) {
minL = min
}
break
}
}
}
return minL
}