- Shortest Subarray with Sum at Least K
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K.
If there is no non-empty subarray with sum at least K, return -1.
Example 1:
Input: A = [1], K = 1
Output: 1
Example 2:
Input: A = [1,2], K = 4
Output: -1
Example 3:
Input: A = [2,-1,2], K = 3
Output: 3
Note:
1 <= A.length <= 50000
-10 ^ 5 <= A[i] <= 10 ^ 5
1 <= K <= 10 ^ 9
解题思路
先求个前缀和
维护一个递增的元素的下标
集合的右端为比它小但最接近它的元素的下标
集合左端为比它小但离他最近的复合答案的元素下标
每次更换保证每次集合中的元素是复合比当前元素小的在插入当前元素
代码
class Solution {
public:
vector<long long>sum;
void init(vector<int> &A) {
sum.push_back(0);
for(int i = 0; i < A.size(); ++i) {
sum.push_back(sum[i]+A[i]);
}
}
const long long mx = 6e9;
int shortestSubarray(vector<int>& A, int K) {
init(A);
int l = 0, r = 0, ans = A.size()+1;
deque<int>qeu;
for (int i = 0; i < sum.size(); ++i) {
while (!qeu.empty() && sum[qeu.back()] >= sum[i]) qeu.pop_back();
while (!qeu.empty() && sum[i]-sum[qeu.front()] >= K) {
ans = min(i-qeu.front(), ans);
qeu.pop_front();
}
qeu.push_back(i);
}
return ans == A.size()+1?-1 :ans;
}
};