https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/description/
堆
思路也比较简单
i1, i2, i3,i4,i5
如果i2->i3这个区间符合条件,那么如果存在另一个区间符合>=k, 这个区间右端点>i3,则左端点一定也大于i2
class Solution {
public:
int shortestSubarray(vector<int>& A, int k) {
priority_queue< pair<int, int>, vector< pair<int, int> >, greater< pair<int, int> > > pq;
int cur = 0, ans = A.size() + 1;
for (int i = 0; i < A.size(); i++) {
cur += A[i];
if (cur >= k) {
ans = min(ans, i + 1);
}
while (pq.size() && cur - pq.top().first >= k) {
ans = min(ans, i - pq.top().second );
pq.pop();
}
pq.push( make_pair(cur, i) );
}
return ans == A.size()+1? -1 : ans;
}
};