题目:
给定一个没有重复的数组nums,找出其中数组中的峰值,数组中可以有多个峰值,返回其中任意一个即可,其中假设nums是无穷大的,
示例 2:
输入: nums = [2,3,2,5,10,15,4]
输出: 1 或 5为峰值索引值
解法:二分法,其时间复杂度为O(lgn)
峰值出现的情况:
- 刚好满足情况,返回mid,(设置初始指针,分别指向,数组第一个元素,和最后一个元素,找到mid=(left+right)//2)
- 中间值,小于相邻的左右两边值,则可以在左边或者右边寻找,都可以,(向左边:(left,mid-1)或者向右边:(mid+1,right))
- 中间值大于左边值,小于右边值,则可以优先在右边寻找峰值,(向右边:(mid+1,right))
- 中间值小于左边值,大于右边值,则可以优先在左边寻找峰值,(向左边:(left,mid-1)。
代码实现:
def search_peak(alist):
return peak_helper(alist,0,len(alist) - 1)
def peak_helper(alist,start,end):
mid = (start + end) // 2
if alist[mid] > alist[mid - 1] and alist[mid] > alist[mid+1]:
return mid #刚好找到
if alist[mid - 1] > alist[mid] and alist[mid] > alist[mid+1]:#向左边寻找
return peak_helper(alist,start,mid-1)
return peak_helper(alist,mid+1,end)#向右边寻找
nums = [2,3,2,5,10,15,4]
search_peak(nums)
Out[1]: 5参考:
;
版权声明:本文为qq_33465047原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
