我想知道,给定一个整数列表,比如l
,如果允许我们从这个列表中选择3个整数,比如left
,middle
,right
,其中middle > left, right
和{index(left)<index(middle)<index(right)
),是否存在一个O(n)
的解决方案来求middle - left + middle - right
的最大值?您可以假设不满足这些条件的列表不会出现(如Eric Duminil指出的[5,0,5])
目前,我能够想出一个我认为(大致)的解决方案(如果我错了,请纠正我)。在
基本上,我目前的想法是:
maximum = 0
for idx in range(1, N - 1):
left = min(l[0: idx])
right = min(l[idx + 1:])
middle = l[idx]
if left < middle and right < middle:
new_max = middle - left + middle - right
maximum = max(new_max, maximum)
如有帮助/提示,将不胜感激。在
谢谢!在
您可以运行一次您的数字,保持一个运行最小值,并将其存储在每个步骤中,这样您就知道每个索引左边的最小值是多少。 这是O(n)。在
类似地,您可以从右到左遍历一次所有的数字,然后计算出每个索引右边的最小值是多少。这是O(n)。在
然后您可以运行每个可能的}值。这是O(n)。在
middle
值,并从您先前的计算中获取left
和{O(n)+O(n)+O(n)=O(n)。在
诀窍在于列表的最小值总是解的一部分(要么左,要么右)。在
这里有一种计算每个指数左右最小值的方法,用O(n)表示:
现在可以迭代})中的每个中间元素,并找到
^{pr2}$l
(idx
之间的1
和{2 * l[idx] - min_rights[idx] - min_lefts[idx]
的最小值。此操作也是O(n):It输出:
它是
2 * 7 - 0 - 3
。在相关问题 更多 >
编程相关推荐