【问题标题】:Finding the max element in an array, sorted ascending first and then descending查找数组中的最大元素,先升序再降序
【发布时间】:2015-09-07 13:58:01
【问题描述】:

我尝试了一个在线挑战,其中有一个问题如下:

给你一个数组,它先增加然后开始减少。 例如:2 3 4 5 6 7 8 6 4 2 0 -2。 找出这些数组的最大元素。

以下是我使用二进制搜索的代码,它在 O(log(n)) 中给出了正确答案,但我不知道是否有更好的解决方案。 谁能帮我解决这个问题?

a= map(int, raw_input().split())
def BS(lo,hi):
    mid = lo+ (hi-lo)/2
    if a[mid]>=a[mid+1]:
        if a[mid]>a[mid-1]:
            return mid
        else:
            return BS(lo,mid)
    else:
        return BS(mid,hi)

print a[BS(0,len(a)-1)]

【问题讨论】:

  • 我觉得不错。 O(log n) 可能是你能做的最好的(忽略常数因子或不同的对数底)。
  • 如何对未排序的数组进行二分搜索?
  • @haraldkl 修改后的二分查找,代码如上,试试看。
  • @ShubhamAggarwal 现在明白了,一开始忽略了数组排序的特殊描述,你的标题说的是未排序的数组。如果您可以为您的解决方案明确声明“修改过的”二分搜索,而不是在标题中未排序,那就太好了。
  • @ShubhamAggarwal 绝对您的解决方案是完美的。因为您可以通过O(nlogn) 来完成。所有其他解决方案都是由 O(n) 完成的。因此,您的复杂性比其他人更好。

标签: python arrays binary-search


【解决方案1】:

优化变体 - 在大多数情况下快两倍:

# ® Видул Николаев Петров
a = [2, 3, 4, 5, 6, 7, 8, 10, 12, 24, 48, 12, 6, 5, 0, -1]

def calc(a):
    if len(a) <= 2:
        return a[0] if a[0] > a[1]  else a[1]

    l2 = len(a) / 2

    if a[l2 + 1] <= a[l2] and a[l2] >= a[l2 - 1]:
        return a[l2]

    if a[l2] > a[l2 + 1]:
        return calc(a[:l2+1])
    else:
        return calc(a[l2:])

print calc(a) # 48

【讨论】:

  • 很好!这可以是一种优化
【解决方案2】:

我正在使用以下输入 2 3 4 5 5 8 尝试您的代码,答案应该是 8 但答案是 5 我正在发布带有还有几个测试用例

我认为你不能在未排序的数组上运行二进制搜索
该代码还给出了排序数组的大量异常

【讨论】:

  • 这不是一个未排序的数组,可以在这个数组中运行二进制搜索。问题很可能是 OP 没有考虑数字在开始或结束时的边缘情况。我敢打赌,如果你在末尾加上一个较小的数字,那么它会给出正确的结果。
  • 使用 3 4 5 7 进行测试时,会出现大量运行时异常
  • 这就是它未能通过测试用例的原因。非常感谢您指出这一点!
【解决方案3】:

为什么不使用max() 方法??

max(lst) 将返回列表中的最大值

【讨论】:

  • 不允许使用 Python max。它必须实施。
  • 并且不允许列表编译?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多