C++ 总和大于K的最大长度子阵列
我们想找到最大长度的子数组,其和大于k 有效的解决方案之一是对子阵列长度进行二进制搜索。子阵列的长度可以从1到n不等。我们可以在low=1到high=n的范围内进行二进制搜索,对于每一个mid=low+high/2,我们可以检查长度为mid的所有子阵列,如果任何子阵列的和大于On中的k。如果存在任何这样的子阵列,那么我们可以搜索更高长度的子阵列,即低=中+1,否则我们会减少搜索长度,即高=中-1C++ 总和大于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,
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=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循环,这也是可以接受的。是的,数组也包含负整数