拆分数组并找到最大值| max(L)-max(R)|

时间:2018-05-06 17:52:53

标签: arrays algorithm

我在编程方面有一个普遍的问题。 假设我有一个数组,我需要找到索引K,它将数组分成L,R两个部分,以便得到这个值 | max(L)-max(R)|是最大的。

  • max(L)是L部分中的最高编号
  • K指向R
  • 中的第一个成员

3 个答案:

答案 0 :(得分:2)

这似乎是一个问题,只能减少2个可行的解决方案: K 从其余部分中分离出第一个值,或者从其余部分中分离出最后一个值,给你一个小的只有一个值的一部分,以及包含最大值的大部分值。

假设数组中的最大值可以在索引 M 处找到,那么这两个部分中的一个将具有该值,并且它将是 Max(Part)。另一部分应具有尽可能小的最大值。因此,该部分应该减少到一个值:向该部分再添加一个值永远不会降低其最大值。

如果整体最大值位于阵列的一端,则没有选择, small 部分将从其另一端的阵列中切断。

当总体最大值不在数组的末尾时,有两种可能性:选择斩波值最低的那个。换句话说, K 将是1或n-1(在从零开始的索引中),并且这可以在恒定时间内确定,即 O(1)

答案 1 :(得分:2)

实际上,为了解决这个问题,我们可以在不断的时间内完成。

1.由于列表必须分为两个,列表A或列表B将包含最左边或最右边的元素。

  1. 在列表中添加值只能增加列表的最大元素,因此永远不希望有一个大于1的列表
  2. 所以我们需要做的就是看头部和尾部,取最小的A,然后制作清单B的其余部分

    例如考虑6,7,7,3,2,6,4

    A = [4],(头部/尾部最小),B = [6,7,7,3,2,6]

答案 2 :(得分:1)

您可以通过一些准备工作在O(n)中解决它:

  • 制作两个数组,maxL[]maxR[]的大小与原始数组相同
  • 从左侧开始行走原始阵列,将maxL[i]设置为目前为止的最大值
  • 从右侧开始再次行走原始阵列,将maxR[i]设置为目前为止的最大值
  • 现在向任意方向行走maxL[]maxR[],寻找k,以使ABS(maxL[k] - maxR[k])的值最大化;返回k