【发布时间】:2020-09-04 03:32:12
【问题描述】:
def peak(arr,n):
l = 0
r = n-1
while(l<=r):
m = l + (r-l)//2
if m>0 and m<n-1:
if arr[m+1]<arr[m] and arr[m]>arr[m-1]:
return arr[m]
elif arr[m+1]>arr[m] and arr[m]>arr[m-1]:
l = m+1
elif arr[m+1]<arr[m] and arr[m]<arr[m-1]:
r = m-1
elif m>0 and m>=n-1:
if arr[m]>arr[m-1]:
return arr[m]
elif m<=0 and m<n-1:
if arr[m+1]<arr[m]:
return arr[m]
问题是—— 给定一个数组,其中存储在数组中的元素最初按升序排列,然后在达到峰值元素后,存储的元素按降序排列。找到最高的元素。
示例: 输入:
11
1 2 3 4 5 6 5 4 3 2 1
5
1 2 3 4 5
输出: 6 5
谁能告诉我我的代码有什么问题?
【问题讨论】:
-
以上示例正在运行,但在提交时我收到“您的程序花费的时间比预期的要多。时间限制超出预期的时间限制
-
更简洁的代码意味着更少的认知负担,更多地关注问题本身,而不是试图理解运行它的代码。
-
如果有严格的时间限制,则需要使用三元搜索,使其成为 log3(N)。数据实际上可以建模为单峰函数。 en.m.wikipedia.org/wiki/Ternary_search
-
如果允许重复元素,在某些情况下循环不会结束。此外,如果数组中只有一个元素,则循环也不会结束。
-
@SomeDude 不允许重复。如果 n == 1 我添加了基本情况,但我仍然收到错误。您可以查看practice.geeksforgeeks.org/problems/find-the-highest-number/0
标签: python-3.x algorithm binary-search