搜素峰值python(数据结构与算法)

题目:

给定一个没有重复的数组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

参考:

https://leetcode-cn.com/problems/find-peak-element/solution/er-fen-fa-zhu-xing-jie-shi-python3-by-zhu_shi_fu/

;


版权声明:本文为qq_33465047原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。