Link
题意:在log2N时间中,找到一组数中的峰值(大于左右两边)。如1,3,7,4,6,2 中7 6 都是。
解析
一看log2N就知道必定二分,但如何二分,进入左右哪边? 因为这个是求局部的峰值,不必求全局最优之类的。可以发现对于数组中任何一个数字他都能归到某一个峰值区间中,那么对于mid处的数字,如果他小于他后面的数字那他所处的峰值定然在前半部分,反之后半部分。
class Solution(object):
def findPeakElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
numlen=len(nums)
st=
0
ed=numlen-
1
while(st<ed):
mid=(st+ed)/
2
if nums[mid] >nums[mid+
1]:
ed=mid
else:
st=mid+
1
return st
问题
刚开始没有想通这个特性,仅仅在纠结要大于两边,其实在自左至右扫描过程中大于左边的情况已经判断了。后来又想到区间K大数字,想歪了这个必然有快排中的扫描操作。