【问题标题】:Find the Highest number in O(logn) Complexity找到 O(logn) 复杂度中的最高数
【发布时间】: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


【解决方案1】:

问题是代码中的条件没有考虑数组中只有一个元素的情况,即n1。发生这种情况时,所有条件都不成立,while 循环将变为无限循环。

你可以通过默认返回arr[m]来解决这个问题:

while(l<=r):
   m = l + (r-l)//2
   if m>0 and m<n-1:
       ... # your existing code
   else:
       return arr[m]

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多