总和大于K的最大长度子数组

时间:2019-08-19 21:36:07

标签: c++ c++14 sub-array

我们想找到总和大于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 k的子数组。并且如果任意长度的子数组> k,那么通过减小搜索长度,我们可以获得更多的大于k sum的子数组。可能是我们可以减小搜索长度来获得一些子数组> k。 因此,问题归结为决定二元搜索的谓词,即在每个步骤中我们如何决定更改搜索范围?

1 个答案:

答案 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]