Python 在数组中查找最大元素,先升序,然后降序

Python 在数组中查找最大元素,先升序,然后降序,python,arrays,binary-search,Python,Arrays,Binary Search,我尝试了一个在线挑战,问题如下: 您将得到一个数组,该数组先增大,然后开始减小。 例如: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]: i

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

您将得到一个数组,该数组先增大,然后开始减小。 例如:
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)]

我正在用下面的输入2 3 4 5 5 8尝试你的代码,答案应该是8,但答案是5,我正在发布一张带有更多测试用例的图片

我认为您无法在未排序的数组上运行二进制搜索

代码还列出了大量排序数组的异常情况,这是一个经过优化的变体,在大多数情况下速度要快两倍:

# ® Видул Николаев Петров
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

a=[2,3,4,5,6,7,8,10,12,24,48,12,6,5,0,-1]
def计算(a):
如果len(a)a[1]否则a[1]
l2=透镜(a)/2
如果a[l2+1]=a[l2-1]:
返回[l2]
如果a[l2]>a[l2+1]:
返回计算(a[:l2+1])
其他:
返回计算(a[l2:]
打印计算(a)#48

为什么不使用
max()
方法


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

我觉得不错。O(logn)可能是你能做的最好的了(忽略常数因子或不同的对数基)。如何在未排序的数组上进行二进制搜索?@haraldkl这是一个修改过的二进制搜索,上面给出了代码,试试看。@ShubhamAggarwal现在得到了它,起初忽略了数组排序的特殊描述,你的标题是未排序数组。如果您可以明确地为您的解决方案声明“修改的”二进制搜索,而不是在标题中未排序,那就太好了。@ShubhamAggarwal您的解决方案绝对是完美的。因为你可以通过
O(nlogn)
来实现。所有其他解决方案都是通过O(n)实现的。因此,您的复杂性比其他人好。这不是一个未排序的数组,可以在此数组中运行二进制搜索。这个问题很可能是OP没有考虑当一个数字在开始或结束时的边缘情况。我敢打赌,如果在末尾添加一个较小的数字,那么它将给出正确的结果。当使用3 4 5 7进行测试时,会出现大量运行时异常,这就是它无法通过测试用例的原因。非常感谢你指出这一点,伙计!不允许使用Python
max
。必须实施。不允许列表压缩?很好!这可能是一种优化