给出一个由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循环失败。
答案 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: