我在编程方面有一个普遍的问题。 假设我有一个数组,我需要找到索引K,它将数组分成L,R两个部分,以便得到这个值 | max(L)-max(R)|是最大的。
答案 0 :(得分:2)
这似乎是一个问题,只能减少2个可行的解决方案: K 从其余部分中分离出第一个值,或者从其余部分中分离出最后一个值,给你一个小的只有一个值的一部分,以及包含最大值的大部分值。
假设数组中的最大值可以在索引 M 处找到,那么这两个部分中的一个将具有该值,并且它将是 Max(Part)。另一部分应具有尽可能小的最大值。因此,该部分应该减少到一个值:向该部分再添加一个值永远不会降低其最大值。
如果整体最大值位于阵列的一端,则没有选择, small 部分将从其另一端的阵列中切断。
当总体最大值不在数组的末尾时,有两种可能性:选择斩波值最低的那个。换句话说, K 将是1或n-1(在从零开始的索引中),并且这可以在恒定时间内确定,即 O(1)。
答案 1 :(得分:2)
实际上,为了解决这个问题,我们可以在不断的时间内完成。
1.由于列表必须分为两个,列表A或列表B将包含最左边或最右边的元素。
所以我们需要做的就是看头部和尾部,取最小的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
。