给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。子数组 是数组中 连续 的一部分。
示例 1:
输入:nums = [1], k = 1
输出:1
示例 2:
输入:nums = [1,2], k = 4
输出:-1
示例 3:
输入:nums = [2,-1,2], k = 3
输出:3
提示:
1 <= nums.length <= 105
-105 <= nums[i] <= 105
1 <= k <= 109
代码如下
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int n=nums.size();
deque<int> myque;
vector<long long> sum(n+1);
sum[0]=0;
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+nums[i-1];
}
int ans=INT_MAX;
for(int i=0;i<sum.size();i++){
while(!myque.empty() && sum[myque.back()]>=sum[i]){
myque.pop_back();
}
while(!myque.empty() && sum[i]-sum[myque.front()]>=k){
ans=min(ans,i-myque.front());
myque.pop_front();
}
myque.push_back(i);
}
return ans==INT_MAX?-1:ans;
}
};