和至少为k的最短子数组

// 单调栈
// 维护一个具有栈单调性的队列,跟动态规划不一样的是时间复杂度为O(n)
// queue[i]中存放着前缀和
// 我们知道因为负数的存在,所以队列不是单调增长的,但是不单调的其实对我们没有用
// 因为肯定可以找到比它短的(因此我们移除比)
// opt(y)表示比固定的y最大的满足条件的x,因此y - x的最大值就是我们要的值

// 这个递增的队列
// 我们首先建立一个单调增栈
// 出栈则代表碰到了合适的值。因此记录大小

// 其实我更感觉是具有单调性质的滑动窗口呢。。。。。
func shortestSubarray(A []int, K int) int {
prefixSum := make([]int, len(A)+1)
shLen := math.MaxInt32
for i, a := range A {
prefixSum[i+1] = prefixSum[i] + a
}
queue := make([]int, 1, len(prefixSum))
for i := 1; i < len(prefixSum); i++ {
for len(queue) > 0 && prefixSum[queue[len(queue)-1]] >= prefixSum[i] {
queue = queue[:len(queue)-1]
}
queue = append(queue, i)
diff := prefixSum[queue[len(queue)-1]] - K
for len(queue) > 1 && diff >= prefixSum[queue[0]] {
l := i - queue[0]
if l < shLen {
shLen = l
}
queue = queue[1:]
}
}
if shLen == math.MaxInt32 {
return -1
}
return shLen
}

你可能感兴趣的:(和至少为k的最短子数组)