LeetCode Find Peak Element
Posted gavinfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Find Peak Element相关的知识,希望对你有一定的参考价值。
LeetCode解题之Find Peak Element
原题
比左右两个元素大的元素我们称为顶点元素,在给定的一个数组中,没有连续的两个元素是相等的。找出这个数组中某一个顶点元素的下标,如果有多个,给出其中任意一个即可。可以默认在给定的数组两端还各有一个无穷小的元素,即数组[1]的顶点元素下标为0。
注意点:
- 将时间复杂度控制为log(n)
例子:
输入: nums = [1, 2, 3, 1]
输出: 2
解题思路
/ / \/\ / / \/ / \
从上图可以看出,一条上升的边和一条下降的边之间至少夹着一个顶点元素。由于左右两边各有一个无穷小的元素,所以起始的时候最左边的边是上升的,最右边的边是下降的。要求时间复杂度为log(n),我们可以通过二分搜索来判断。我们取中点和它后面的一个点,如果这两个点构成的边是上升的,那我们就把中点左边的点抛弃掉,这时候仍然满足最左边的边是上升的,最右边的边是下降的;如果两个点构成的边是下降的,那么该把中点右边的点抛弃掉,这样仍然满足上面的要求,保证左右两个点之间至少有一个顶点元素。至于如何在两点中选择新的左右节点,我们要尽可能使新的左右节点靠近顶点元素,因为最终的终止条件是左右节点重合。所以选择新的左节点时,应该选中点的后一个节点,而选新的右节点时,选择中点。
AC源码
class Solution(object):
def findPeakElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left, right = 0, len(nums) - 1
while left < right:
mid = (right + left) // 2
if nums[mid] < nums[mid + 1]:
left = mid + 1
else:
right = mid
return left
if __name__ == "__main__":
assert Solution().findPeakElement([1, 2, 3, 1]) == 2
欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
以上是关于LeetCode Find Peak Element的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 162 Find Peak Element(二分法)
刷题-LeetCode162 Find Peak Element