当前位置: 首页 > 知识库问答 >
问题:

在一个数组中,求当前元素为最大的最长子数组长度之和的优化算法

牟子真
2023-03-14

我有一个数组,类似于[1,3,5]。对于这些元素中的每一个,我都需要找到当前元素最高的最长子数组。答案是所有子数组的长度之和。

最终答案=1+2+3=6[单个子数组的长度]

对于这个问题,我可以给出一个强力O(N^2)。有没有更好的办法来解决这个问题?

共有1个答案

袁鹤轩
2023-03-14

我给你两个提示。

提示1:时间复杂度和空间复杂度O(n)的解决方案是可能的。n是给定数组arr中的元素数。dynamic-programming标记会导致头脑固守它,而不是探索其他可能的解决方案。

现在就停在这里,在进一步阅读之前,你自己试试。

有意的空白,避免让你无意中读到第二个提示

.

.

Index:  0   1   2   3   4   5   
Arr:    44  91  58  54  7   38  

长度之和=17。所以,我们有一个正确的解决方案。

后续问题:如果arr中存在重复项,上述解决方案是否有效?如果没有,你会对上面的算法做什么改变来使其工作?提示:玩><=会有帮助吗?

 类似资料:
  • 给定一个整数N和一个长度为N的数组,该数组由0到N-1的整数组成,可能包含也可能不包含所有整数,也可能包含重复数。查找一个从索引i到索引j的子数组(i, j),使其包含数组中的所有整数,并且具有最小长度。输出是这样一个子数组的长度 示例:A=[2,1,1,3,2,1,1,3],因此最小子数组长度=3,因为A[2]到A[4]包含所有数字 我的想法: 维护一个计数器数组和两个索引开始和结束,其中包含数

  • O(n^2)算法简单。有没有人对此有更好的算法?

  • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

  • 我有一个数组[1,2,3],总和为4。所以所有的连续子数组都是 [1],[1,2][2,3] 和 [1,2,3]。因此,小于或等于总和的最大长度子数组为 [1,2],长度为 2。 我用下面的方法找到了所有的子数组,并检查了子数组的和,如下所示。但是这种方法不适用于负数。{1,2,1,1,3,-2,-3,7,9};答:7

  • 我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?

  • 有没有一种方法可以在小于O(n^2)的时间内做到这一点。 O(nlogn)还是O(n)?