难度:
Hard
题意:
思路:
代码:
class Solution {
private class Node {
int sum;
int pos;
public Node(int sum, int pos) {
this.sum = sum;
this.pos = pos;
}
}
private int find(Node[] incrQueue, int n, int value) {
int left = -1;
int right = n;
while (right - left > 1) {
int mid = (left + right) / 2;
if (incrQueue[mid].sum <= value) {
left = mid;
} else {
right = mid;
}
}
return left;
}
public int shortestSubarray(int[] A, int K) {
Node[] incrQueue = new Node[A.length + 1];
int n = 0;
int ret = 0x3fffffff;
incrQueue[n++] = new Node(0, -1);
int sum = 0;
for (int i = 0;i < A.length;i++) {
sum += A[i];
int pos = find(incrQueue, n, sum - K);
if (pos != -1) {
ret = ret < (i - incrQueue[pos].pos) ? ret : (i - incrQueue[pos].pos);
}
while (n != 0 && incrQueue[n - 1].sum > sum) {
n--;
}
incrQueue[n++] = new Node(sum, i);
}
if (ret == 0x3fffffff) {
return -1;
} else {
return ret;
}
}
}