我们想找到总和大于k的最大长度子数组。
一种有效的解决方案是对子数组的长度进行二进制搜索。子数组的长度可以在1到n之间变化。我们可以在low = 1到high = n范围内进行二进制搜索,对于每个mid =(low + high)/ 2,如果O(n)中有任何子数组的总和大于k,我们可以检查length = mid的所有子数组。如果存在任何这样的子数组,那么我们可以搜索更长的子数组,即low = mid + 1,否则我们将减小搜索长度,即high = mid-1。
int maxlen(vector<int> v)
{
int hi = n, lo = 1, ans = -1, mid, cnt = 0;
while(lo <= hi) {
mid = hi+lo>>1;
if(cnt = count(mid)) {
ans = mid;
lo = mid + 1;
} else {
hi = mid - 1;
}
return ans;
}
int count(int len) {
int cnt = 0;
for(int i = len; i <= n; i++)
if(prefixsum[i] - prefixsum[i - len] > K)
cnt++;
return cnt;
}
让我感到困惑的是,如果对于当前长度的子数组,我们得出sum
答案 0 :(得分:0)
算法不正确(除了实现中的错误)。
考虑k = 5的数组[6 -7 3 0 0 0 3]
。
low=1 high=7 mid=4 no subarray > k
low=1 high=3 mid=2 no subarray > k
low=1 high=1 mid=1 subarray [6] has sum > k
result: [6] with length 1
但真正的答案是长度为5的[3 0 0 0 3]
。