Arrays 拆分数组并找到最大| max(L)-max(R)|
我有一个关于编程的一般性问题。 假设我有一个数组,我需要找到把数组分成两部分的索引K,这样值 |max(L)-max(R)|是最大的Arrays 拆分数组并找到最大| max(L)-max(R)|,arrays,algorithm,Arrays,Algorithm,我有一个关于编程的一般性问题。 假设我有一个数组,我需要找到把数组分成两部分的索引K,这样值 |max(L)-max(R)|是最大的 最大值(L)是L部分中的最大值 K指向R中的第一个成员 您可以通过一些准备工作在O(n)中解决它: 将两个数组,maxL[]和maxR[]的大小与原始数组相同 从左侧开始遍历原始数组,将maxL[i]设置为到目前为止的最大值 从右侧开始再次遍历原始数组,将maxR[i]设置为到目前为止的最大值 现在在任何方向上行走maxL[]和maxR[],寻找k,使ABS(
- 最大值(L)是L部分中的最大值
- K指向R中的第一个成员
- 将两个数组,
和maxL[]
的大小与原始数组相同maxR[]
- 从左侧开始遍历原始数组,将
设置为到目前为止的最大值maxL[i]
- 从右侧开始再次遍历原始数组,将
设置为到目前为止的最大值maxR[i]
- 现在在任何方向上行走
和maxL[]
,寻找maxR[]
,使k
的值最大化;返回ABS(maxL[k]-maxR[k])
k
当总最大值不在数组的末尾时,有两种可能性:选择截断值最低的一种。换句话说,K将是1或n-1(在基于零的索引中),这可以在恒定时间内确定,即O(1)。实际上,要解决这个问题,我们可以在恒定时间内完成 1.由于列表必须一分为二,列表A或列表B将包含最左边或最右边的元素
例如考虑6、7、7、3、2、6、4
A=[4],(最小的头/尾),B=[6,7,7,3,2,6]尝试插值看起来答案总是k=2或k=n-2,对吗?请注意,在这种方法的实际实现中,您实际上不会显式构建两个数组,因为您可以在检查
ABS(maxL[k]的同一过程中动态计算另一个数组的值-maxR[k])
@user8446864对。毕竟,这似乎不是一个非常有趣的编程问题,只是一个与编程相关的难题。找到一个绝对差异最小的分割听起来像是一个更有趣的问题。@ruakh对,这是一个有效的优化。事实证明这也是不必要的,因为这个问题有一个O(1)解。找到相同函数的min
可能会更有趣。我想我是第一个发布此解决方案的人,但在找到它方面做得很好:)