山序中的最大数量

时间:2018-11-16 17:02:49

标签: python-3.x for-loop

给出一个由n个整数组成的山峰序列,先递增然后递减,找到山峰顶。

示例

给出数字= [1、2、4、8、6、3]返回8

给出数字= [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循环失败。

2 个答案:

答案 0 :(得分: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的列表的测试。

答案 1 :(得分:0)

这将从您的输入中获取所有三元组,将中间居中的所有三元组分离出来,然后向左或向右分离,然后返回总体上最高的三元组:

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

它不能处理高原。

Doku: