【问题标题】:Maximum length subarray having sum greater than K总和大于 K 的最大长度子数组
【发布时间】:2019-12-25 02:45:55
【问题描述】:

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

一种可行的解决方案是对子数组的长度进行二进制搜索。子数组的长度可以在 1 到 n 之间变化。我们可以在 low=1 到 high=n 的范围内进行二分搜索,对于每个 mid=(low+high)/2,如果任何子数组在 O(n) 中的总和大于 k,我们可以检查长度=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。可能是我们可以减少搜索长度以获得一些子数组>k。 所以,问题归结为决定二分搜索的谓词,即在每一步我们将如何决定更改搜索范围?

【问题讨论】:

  • 整个数组不是总和大于k的最大子数组吗?
  • 为什么会这样?
  • @NathanOliver 我认为有些条目可能是负面的,所以情况可能并非总是如此
  • 这种在线测验网站问题或面试问题正在寻找一种可以轻松计算的特定算法,一次通过。显示的代码不是它,对不起。正确的解决方案包括一个外部for 循环、一个内部while 循环以及一个函数中的三个变量。显示的代码完全向后执行此操作,并且使用了不正确的方法(可能是外部 while 循环,而不是 for 循环,这也是可以接受的)。
  • 是的,数组也包含负整数

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


【解决方案1】:

算法不正确(除了实现中的错误)。

考虑数组[6 -7 3 0 0 0 3],k=5。

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。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2013-03-05
    • 2016-12-20
    • 2016-12-29
    • 2020-11-22
    • 2012-10-22
    • 2013-08-06
    • 2022-12-12
    • 2017-03-16
    相关资源
    最近更新 更多