862.和至少为k的子数组
给你一个整数数组 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
代码:(long long数组)
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
int n = nums.size();
vector<long long> sums(n + 1, 0);
for (int i = 1; i <= n; ++i) sums[i] = sums[i - 1] + nums[i - 1];
deque<int> q;
int ans = -1;
q.push_back(0);
int pre = -1;
for (int i = 1; i <= n; ++i) {
pre = -1;
while (!q.empty() && sums[i] - sums[q.front()] >= k) {
pre = q.front();
q.pop_front();
}
if (pre != -1 && (ans == -1 || i - pre < ans)) ans = i - pre;
while (!q.empty() && sums[q.back()] >= sums[i]) q.pop_back();
q.push_back(i);
}
return ans;
}
};