python - O(n) 寻找最大差异总和的解决方案 python 3.x?

标签 python performance python-3.x optimization time-complexity

我想知道,给定一个整数列表,比如说 l ,如果允许我们从这个列表中选择 3 个整数,比如 left , middle , right , 其中middle > left, rightleft, middle, right以该顺序出现在列表中(即 index(left)<index(middle)<index(right) ),是否存在 O(n)寻找 middle - left + middle - right 最大值的解决方案?您可能会认为不满足这些条件的列表不会出现(例如 Eric Duminil 指出的 [5, 0, 5])

目前,我能够想出我认为(大致)一个 O(n^2)解决方案(如果我错了请纠正我)。

基本上,我目前的想法是:

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)。

然后您可以遍历每个可能的 middle 值,并从您之前的计算中获取 leftright 值。即 O(n)。

O(n) + O(n) + O(n) = O(n)。

关于python - O(n) 寻找最大差异总和的解决方案 python 3.x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45961323/

相关文章:

python - 将 CSR 矩阵乘以向量

python - 查找具有最高值的列( Pandas )

python - 为什么 del <object> 不删除它?

c++ - 在 C++ 中,哪个更快? (2 * i + 1) 或 (i << 1 | 1)?

linux - 无法在 Alpine Linux v3.5 上安装 aiohttp==2.0.6

python - 使用带有 TEMPLATE.format() 的字典时出现关键错误

python - 使用 Matplotlib 创建 CSV 数据的实时图

performance - 在 Julia 中测量 CPU 运行时间

python - 针对循环性能问题的 Pandas 重采样

Python Google Drive API - 获取我的云端硬盘文件夹的 ID