sum数组用于存放前n项和,如sum[i + 1]即为前i项和
sum[j] - sum[k] 相当于原数组[j,k]这个区间的和
sum[0] = 0是为了方便后面直接利用前n项和,当没有出现负数替换掉0的情况时
sum[i] - sum[dq.front()](实际上就是sum[i] - sum[0])可获得前n项和
利用deque存放sum中元素,在遍历sum时,若dq末尾存放的数字对应的sum大于当前遍历到的sum值,则pop出
这样便可以获得递增序列,当首位两元素对应的sum的插值大于等于K,则pop出dq头部元素
class Solution {
public:
int shortestSubarray(vector<int>& A, int K) {
int n = A.size();
if (n == 0) return -1;
int sm = 0;
vector<int> sum;
sum.push_back(0);
for (int i : A) {
sm += i;
sum.push_back(sm);
}
int i = 0, ans = INT_MAX;
deque<int> dq;
while (i <= n) {
while (!dq.empty() && sum[i] < sum[dq.back()]) {
dq.pop_back();
}
while (!dq.empty() && sum[i] - sum[dq.front()] >= K) {
ans = min(ans, i - dq.front());
dq.pop_front();
}
dq.push_back(i);
++i;
}
return ans > n ? -1 : ans;;
}
};