【问题标题】:Maximum Number in Mountain Sequence山序列中的最大数量
【发布时间】:2018-11-16 17:02:48
【问题描述】:

给定一个先增后减的n个整数的山序列,找到山顶。

例子

给定 nums = [1, 2, 4, 8, 6, 3] 返回 8

给定 nums = [10, 9, 8, 7],返回 10

class Solution:
     """
    @param nums: a mountain sequence which increase firstly and then decrease
    @return: then mountain top
    """
    def mountainSequence(self, nums):
        # write your code here
        if nums == []:
            return None
        if len(nums) <= 1:
            return nums[0]
        elif len(nums) <= 2:
            return max(nums[0], nums[1])


        for i in range(len(nums) -2):
            if nums[i] >= nums[i + 1]:
                return nums[i]
        return nums[-1]

它停留在 [3,5,3]。根据我的分析,运行for循环后出错了。但我不知道为什么 for 循环失败了。

【问题讨论】:

  • 假设你不尝试二分搜索(也许你应该);为什么不只是max(nums)
  • 10 不是一座山——它事先不增加,之后减少
  • 高原怎么样:7, 8, 9, 9, 9, 8, 7 ?
  • 实际上不允许使用 max()。我只是懒得再写一些如果。哈哈
  • 您为 range 函数提供了错误的参数,并且循环缺少一个元素。将其更改为 range(len(nums) - 1)

标签: python-3.x for-loop


【解决方案1】:

这应该比您的方法更有效。这是为您的用例定制的二分搜索:

def top(lst):
    low = 0
    high = len(lst)
    while low != high:
        i = (high+low)//2
        if lst[i] < lst[i+1]:
            low = i+1
        else:
            high = i
    return low

它从列表的中间开始并检查该系列是否仍在增加。如果是,它会设置low,并将在算法的其余部分忽略low 以下的所有索引。如果系列已经减少,high 将设置为当前索引,并且上面的所有元素都将被忽略。等等……当high == low算法终止时。

如果您的列表最多有两个或更多相同的元素(高原),算法甚至不会终止。

我跳过了空列表或长度为 1 的列表的测试。

【讨论】:

  • 感谢您的回答。我知道二进制搜索解决方案。我只是想弄清楚我的代码有什么问题。但是谢谢!
  • 您忽略了最后一个 for 循环中的最后一个元素...应该是 range(len(nums) - 1)
  • 天啊!明白了!非常感谢!
【解决方案2】:

这将从您的输入中获取所有三元组,将中间高于左侧或右侧的所有三元组分离出来,并返回总体最高的三元组:

def get_mountain_top(seq):
    triplets = zip(seq, seq[1:], seq[2:])

    tops = list(filter(lambda x: x[0] < x[1] > x[2], triplets))

    if tops:
        # max not allowed, leverage sorted
        return sorted(tops, key = lambda x:x[1])[-1]
        # return max(tops,key = lambda x:x[1])

    return None


print(get_mountain_top([1,2,3,4,3,2,3,4,5,6,7,6,5]))
print(get_mountain_top([1,1,1]))

输出:

(6,7,6)
None

它不处理高原。

独库:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多