Algorithm 带消去的最大子阵

Algorithm 带消去的最大子阵,algorithm,arrays,Algorithm,Arrays,我知道如何在O(n)中找到数组的最大连续子数组。 但是,以下链接中的第二个问题要求在消除某些元素(k)时查找最大连续子阵列: 我似乎找不到一个有效的方法来做这件事。考虑到我认为做一个O(N^2)解决方案就行了。我不会告诉你如何解决这个问题,但会给你一些提示: 请注意,数字的值非常有限-它们可能仅在范围[-10^4,10^4]内。这使得有一个数组可以计算给定值下的数字数量(在整个数组中或仅在给定间隔内) 迭代将要选择的子阵列的长度,并在线性时间内解决每个长度的问题 请注意,对于给定的数组,如果k值

我知道如何在O(n)中找到数组的最大连续子数组。 但是,以下链接中的第二个问题要求在消除某些元素(k)时查找最大连续子阵列:
我似乎找不到一个有效的方法来做这件事。

考虑到我认为做一个O(N^2)解决方案就行了。我不会告诉你如何解决这个问题,但会给你一些提示:

  • 请注意,数字的值非常有限-它们可能仅在范围[-10^4,10^4]内。这使得有一个数组可以计算给定值下的数字数量(在整个数组中或仅在给定间隔内)
  • 迭代将要选择的子阵列的长度,并在线性时间内解决每个长度的问题
  • 请注意,对于给定的数组,如果k值小于k,则始终会丢弃子数组中最小的k值或所有负数
  • 希望这将帮助您解决问题。

    有一个O(N.K)动态规划解决方案:


    d[i][j]
    (0你能展示你的低效方式吗?如果你了解连续子阵列解决方案是如何工作的,你应该能够对带有一些洞的连续子阵列的情况稍微修改一下。后者的复杂性实际上是O(N log K)。无需更多提示,此数字完全是免费提供的。查看您的评论后,问题变得非常简单。感谢您的提示
    ,因为我认为执行O(N^2)有限制解决方案可以
    在最坏的情况下,N可以是10^4-这有点边缘化,可能不会超过时间限制。@NHAHDH我通常在2秒的时间限制内选择N^2解决方案。我见过的大多数在线判断系统即使在2秒内完成10亿次或更多操作也能通过。我相信这个解决方案足够快。另外,请注意我建议的解决方案是非常简单的计算,所以它实际上只使用大约2*10^8个简单运算。我应该相信。如果你这么说,那就足够了——我自己很少冒险接近时间限制,所以我真的不知道。
    for i = 1 to N:
         d[i][0] = max (d[i-1][0]+a[i], 0)
         for j = 1 to K:
             d[i][j] = max(d[i-1][j]+a[i], d[i-1][j-1])