返回 A
的最短的非空连续子数组的长度,该子数组的和至少为 K
。
如果没有和至少为 K
的非空子数组,返回 -1
。
题解:DP+状态压缩
int shortestSubarray(int* A, int ASize, int K)
{
int ans = -1;
int pos = 0;
int sum = 0;
for (int i = 0; i < ASize; ++i)
{
if (A[i] >= K)
return 1;
sum += A[i];
if (sum <= 0)
{
pos = i+1;
sum = 0;
continue;
}
for (int j = i-1; A[j+1] < 0; --j)
{
A[j] += A[j+1];
A[j+1] = 0;
}
if (sum >= K)
{
while (sum - A[pos] >= K || A[pos] <= 0)
{
sum -= A[pos];
pos++;
}
if (ans > (i-pos+1) || ans < 0)
ans = i-pos+1;
}
}
return ans;
}