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

使用分段树从给定数组中找出最大的和子数组

白晋鹏
2023-03-14

共有1个答案

颛孙英才
2023-03-14

根据我对Justin答案的评论,您可以增加一个标准段树,以实现O(log(n))查询时间,并使用O(n log(n))构建树的时间,即将所有n个元素插入到树中。

其思想是在每个节点v中不仅存储一个值,还存储四个值:

  1. max_value[v]:=v`s子树中的最大连续和
  2. left_value[v]:=与v的子树对应的值域左界相邻的最大连续和
  3. right_value[v]:=与v的子树对应的值域右界相邻的最大连续和
  4. sum[v]:=v的子树中所有元素的和

为了对节点v执行更新操作,必须重新计算max_value[v]、left_value[v]、right_value[v]、sum[v]。这很简单,我想你可以自己弄明白--有几种情况需要考虑。

查询操作类似于基本段树中的查询操作。唯一的区别是,在本例中,在计算结果时还必须考虑left_value[v]right_value[v]-同样,还有一些容易考虑的情况。

我希望你能找出省略的细节。如果没有,让我知道,我会给更详细的解释。

 类似资料:
  • 我正在制作一个数组,它从1-100生成随机数。然后,在最后,我将从列表中输出最大值和最小值。但是,我不知道如何找到/调用max和min,我尝试使用math方法函数(如math.min()),但我认为它对数组不起作用。这是我的代码(下划线是我想要调用最大值和最小值的地方,但我不知道如何调用)。 }

  • 这个问题有多项式解吗?如果有,你能呈现吗?

  • 本文向大家介绍写一个函数找出给定数组中的最大差值相关面试题,主要包含被问及写一个函数找出给定数组中的最大差值时的应答技巧和注意事项,需要的朋友参考一下 function getMax(arr){ for(let i=arr[arr.length-1];i>0;i--){ for(let j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ let temp

  • 如果某些数组索引不能配对,我将如何找到唯一正整数数组的最大和? 例如,我们有一个数组:[8,2,1,3,9,4] 索引(0,4)和(4,5)处的元素彼此不喜欢。 在这种情况下,最大和为:8 2 1 3 4=18 假设这是100个条目的规模和多达一半的约束,您将如何处理这个问题? 是否有一个像图形这样的数据结构是有用的还是有一些DP?我主要关心的是高效的运行时。

  • 给出了一个由N个整数组成的数组。 数组的最大和是该数组的非空连续子数组的元素的最大和。 例如,数组[1,-2,3,-2,5]的最大和是6,因为子数组[3,-2,5]的和是6,并且不可能实现更大的子数组和。 现在,您只能从给定数组中删除一个以上的元素。这样做可以得到的结果数组的最大可能最大和是多少? 我正在用我自己的测试用例测试我的代码。我在Dev-C++上得到了正确的输出。但是当我在网上测试我的代