和至少为 K 的最短子数组


思路分析 :
比较好想到的是用尺取法来做,但是数据有负数,如何还是按正常的尺取法做,那么得到的答案有可能不是最优解
那么我们可以用单调队列来求解,单调队列中保存前缀和

代码示例:
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
deque<int>que;
int n = nums.size();
vector<long long> sum(n+10);
sum[0] = 0;
for(int i = 1; i <= n; i++){
sum[i] = sum[i-1] + nums[i-1];
// printf("%d ", sum[i]);
}
int ans = 99999999;
for(int i = 0; i <= n; i++){
while(!que.empty() && sum[i] <= sum[que.back()]){
que.pop_back();
}
while(!que.empty() && sum[i]-sum[que.front()] >= (long long)k){
ans = min(ans, i-que.front());
que.pop_front();
}
que.push_back(i);
}
if (ans == 99999999) ans = -1;
return ans;
}
};
东北日出西边雨 道是无情却有情

浙公网安备 33010602011771号