162.寻找峰值

描述

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞。

示例

示例 1:

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。

说明:

你的解法应该是 O(logN) 时间复杂度的。

思路

对于这题, 最简单地解法就是遍历数组, 只要找到第一个元素,大于两边就可以了,这种复杂度为 O(N) 。 但这题要求时间复杂度为 O(logN) ,所以我们通过二分来做。

首先我们找到中间节点 mid , 如果大于两边返回当前 index 就可以了,如果左边的节点比 mid 大, 那么我们可以继续在左半区间查找, 这里面一定存在一个 peak , 为什么这么说呢?假设此时的区间范围为 [0, mid -1] , 因为 num[mid - 1] 一定大于 num[mid] 了, 如果 num[mid - 2] <= num[mid - 1] , 那么 num[mid - 1] 就是一个 peak 。 如果 num[mid - 2] > num[mid - 1] , 那么我们就继续在 [0, mid - 2] 区间查找, 因为 num[-1] 为负无穷, 所以最终我们绝对能在左半区间找到一个 peak 。 同理右半区间一样。

class Solution:
def findPeakElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if n == 1:
return 0 start = mid = 0
end = n - 1 while start <= end:
mid = start + (end - start) // 2
if (mid == 0 or nums[mid-1] < nums[mid]) and (mid == n-1 or nums[mid] > nums[mid+1]):
return mid
elif mid > 0 and nums[mid - 1] > nums[mid]:
end = mid - 1
else:
start = mid + 1 return mid

GitHub地址:https://github.com/protea-ban/LeetCode

最新文章

  1. 将表数据生成Insert脚本
  2. 各操作系统配置java环境变量
  3. jquery zclip 复制黏贴功能不能实现
  4. Azure SQL 数据库与新的数据库吞吐量单位
  5. Python绘图和数值工具:matplotlib 和 numpy下载与使用
  6. 滑动选择日期(基于sui-mobile的移动端)
  7. EasyUI中dialog中嵌入form细节问题记录
  8. 玲珑杯#2.5 A-B
  9. 如何将markdown转换为wxml
  10. windows安装多个python及pip版本
  11. 嵌入式Linux系统的构成和启动过程
  12. PetaPoco在ASP.NET Core 2.2中使用注入方式访问数据库
  13. Linux系统加固
  14. 解决“centos 下bash: g++: 未找到命令...”
  15. maven(19)-生命周期和内置插件
  16. 【C#/WPF】.Net生成二维码QRCode的工具
  17. ActiveMQ内存配置和密码设置
  18. HTML是什么与基础格式
  19. 【转载】惠新宸:PHP在百度的应用现状及展望
  20. jmeter 函数助手

热门文章

  1. day18-事务与连接池 2.事务介绍与mysql下事务操作
  2. Unity ios、android、pc一键打包(一)
  3. cocos2d-x 初探helloWorld
  4. 4-fiddler抓包中文乱码:
  5. Java 集合框架必记框架图
  6. Schwartz kernel theorem施瓦兹核定理
  7. 编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合
  8. 【Head First Java 读书笔记】(三)primitive主数据类型和引用
  9. 平方十位数——第八届蓝桥杯JavaB组(国赛)第一题
  10. 汉字转拼音类EcanConvertToCh