1. 862. 和至少为 K 的最短子数组
image-20220208181429829
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef long long LL;
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int n = nums.size();
vector<LL> s(n + 1);
for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + nums[i - 1];
deque<int> q;
q.push_back(0);
int res = INT_MAX;
for (int i = 1; i <= n; i ++ ) {
while (q.size() && s[q.front()] + k <= s[i]) {
res = min(res, i - q.front());
q.pop_front();
}
while (q.size() && s[q.back()] >= s[i]) q.pop_back();
q.push_back(i);
}
if (res == INT_MAX) res = -1;
return res;
}
};