方法:前缀和+单调队列
求出nums数组的前缀和数组,依次进行遍历同时维护一个单调队列。当当前枚举的前缀和减去队头的前缀和之差大于等于k,则弹出队头,同时更新答案;当队尾的前缀和大于等于当前枚举的前缀和,则弹出队尾。
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int ans=-1,cur=0;
int n=nums.size();
vector<long long> s(n+1,0);
for(int i=0;i<n;i++){
s[i+1]=s[i]+nums[i];
}
deque<int> q;
for(int i=0;i<=n;i++){
long long cur=s[i];
while(!q.empty()&&cur-s[q.front()]>=k){
if(ans==-1||ans>i-q.front()) ans=i-q.front();
q.pop_front();
}
while(!q.empty()&&s[q.back()]>=cur){
q.pop_back();
}
q.push_back(i);
}
return ans;
}
};
时间复杂度:O(n),每一个元素都入队出队一次。
空间复杂度:O(n)。