【发布时间】: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