C++ 总和大于K的最大长度子阵列

C++ 总和大于K的最大长度子阵列,c++,c++14,sub-array,C++,C++14,Sub Array,我们想找到最大长度的子数组,其和大于k 有效的解决方案之一是对子阵列长度进行二进制搜索。子阵列的长度可以从1到n不等。我们可以在low=1到high=n的范围内进行二进制搜索,对于每一个mid=low+high/2,我们可以检查长度为mid的所有子阵列,如果任何子阵列的和大于On中的k。如果存在任何这样的子阵列,那么我们可以搜索更高长度的子阵列,即低=中+1,否则我们会减少搜索长度,即高=中-1 int maxlen(vector<int> v) { int hi = n,

我们想找到最大长度的子数组,其和大于k

有效的解决方案之一是对子阵列长度进行二进制搜索。子阵列的长度可以从1到n不等。我们可以在low=1到high=n的范围内进行二进制搜索,对于每一个mid=low+high/2,我们可以检查长度为mid的所有子阵列,如果任何子阵列的和大于On中的k。如果存在任何这样的子阵列,那么我们可以搜索更高长度的子阵列,即低=中+1,否则我们会减少搜索长度,即高=中-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;
}
让我困惑的是,如果我们得到当前长度子数组的sumk。如果我们有任意长度的子数组>k,那么通过减少搜索长度,我们可以得到更多大于k和的子数组。这可能是因为我们可以减少搜索长度以获得一些子数组>k。
因此,问题归结为确定二进制搜索的谓词,即在每个步骤中,我们将如何决定更改搜索范围?

除了实现中的错误之外,该算法是不正确的

考虑k=5的数组[6-7 3 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

但真正的答案是[3 0 0 0 3],长度为5。

整个数组不是最大的子数组,其和大于k吗?为什么会是?NathanOliver我假设一些条目可能是否定的,所以这可能并不总是这种情况这类在线测验网站问题或采访问题,正在寻找一种特定的算法,可以很容易地在一个过程中计算出来。显示的代码不是它,抱歉。正确的解决方案包括一个外部for循环、一个内部while循环以及一个函数中的三个变量。显示的代码完全是反向的,使用不正确的方法可能是外部while循环,而不是for循环,这也是可以接受的。是的,数组也包含负整数