题目

https://leetcode.com/problems/find-peak-element/

题解

2021-7-21 16:28:31 更新版思路:

根据左神在 课上 说的,可以使用二分法找到局部最小值,看上升或下降坡度,则有点类似于罗尔定理的感觉。同理,也可以用二分找到局部最大值,具体可以参考本题 英文版官方题解中文版图解.
罗尔定理:如果 R 上的函数 f(x) 满足以下条件:
(1)在闭区间 [a,b] 上连续
(2)在开区间 (a,b) 内可导
(3)f(a)=f(b)
则至少存在一个 ξ∈(a,b),使得 f’(ξ)=0。
实际上,当我们找到一个上升沿的时候,可以推断它的右边必然有一个山峰,如果没有的话,它就是最后一个上升沿,而最后一个上升沿的右端点,或者第一个下降沿的左端点也是山峰。

不严谨的证明过程,不保证正确…可以参考一下:

class Solution {public int findPeakElement(int[] nums) {int L = 0,R = nums.length - 1;while(L < R){int M = L + ((R - L) >> 1);if(nums[M] > nums[M+1]) R = M;else L = M+1;}return L;}
}

写题时的原思路

看题目要求是 O(log n),想到每次删一半,但是写完之后才发现并不符合要求。。先将错就错吧,后面有空再完善下。

第一次比较次数为 n/2,第二次比较次数为 n/4,第三次8/n,…,总比较次数为 n/2+n/4+n/8+n/16+…= ?

根据《算法导论》“同时找最大最小元素的最小比较次数”的原理,也是每次删一半,即不重复的两两比较。

所以每次淘汰一半后,最后剩下的是最大值,也就是 Peak Element。

class Solution {public int findPeakElement(int[] nums) {ArrayList<Integer> list = new ArrayList<>();ArrayList<Integer> index = new ArrayList<>();for (int i = 0; i < nums.length; i++) {list.add(nums[i]);index.add(i);}while (list.size() != 1) {ArrayList<Integer> newList = new ArrayList<>();ArrayList<Integer> newIndex = new ArrayList<>();for (int i = 0; i < list.size() - 1; i += 2) { // 两两比较,每次扔掉一半if (list.get(i) > list.get(i + 1)) {newList.add(list.get(i));newIndex.add(index.get(i));} else {newList.add(list.get(i + 1));newIndex.add(index.get(i + 1));}}if (list.size() % 2 == 1) { // 奇数个数情况,简单起见,末尾元素无条件进入下一轮判断newList.add(list.get(list.size() - 1));newIndex.add(index.get(index.size() - 1));}list = newList;index = newIndex;}return index.get(0);}
}

leetcode 162. Find Peak Element | 162. 寻找峰值(二分法找局部最大值)相关推荐

  1. LeetCode:Find Peak Element - 寻找一个数组内的顶点

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Find Peak Element(寻找一个数组内的顶点) 2.题目地址 https://leetcode.co ...

  2. leetcode 【 Find Peak Element 】python 实现

    题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...

  3. 162. Find Peak Element

    文章目录 1 题目理解 2 线性扫描 3 递归二分查找 1 题目理解 输入:int[] nums并且 nums[i]!=nums[i+1] 输出:找到称为峰值的那个数字,返回其下标. 规则:峰值是指: ...

  4. 寻找峰值(局部最大、局部最小)——二分查找

    寻找峰值 也就是局部最大,可以采用二分法来实现.当然局部最小也一样. 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况 ...

  5. python寻峰,[LeetCode][Python]162. 寻找峰值

    [LeetCode][Python]162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数 ...

  6. java 寻找峰值峰谷_Java实现 LeetCode 162 寻找峰值

    162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返 ...

  7. 11 寻找峰值(Find Peak Element)

    文章目录 1 题目 2 描述 3 思路 3.1 图解 3.2 时间复杂度 3.3 空间复杂度 4 源码 1 题目   寻找峰值(Find Peak Element) lintcode:题号--75,难 ...

  8. 算法系列——寻找峰值 (Find Peak Element)

    题目描述 题目链接:https://leetcode-cn.com/problems/find-peak-element/ A peak element is an element that is g ...

  9. leetcode 寻找峰值

    162. 寻找峰值 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 ...

最新文章

  1. Linux系统轻量级监控工具monitorix和munin安装
  2. 给VIM安装YouCompleteMe插件
  3. UVa455 Periodic Strings(kmp)
  4. echarts 中 symbol 自定义图片
  5. Team Foundation Server 2010 安装、部署与配置(六):创建 Team Project .
  6. oracle12输出文件性能慢,输出选项 (Oracle Solaris Studio 12.2:性能分析器)
  7. 关于零基础学习web前端开发,有些过来经验分享
  8. OPEN(SAP) UI5 学习入门系列之四:更好的入门系列-官方Walkthrough
  9. Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题
  10. resnet18实现cifar10分类
  11. #转载汉化 用C++写出来的人工智能围棋游戏
  12. 用计算机求平方根立方根,利用计算器求平方根、立方根
  13. android 模拟器装apk,如何在Android模拟器中安装apk文件
  14. 小程序 打开地图导航
  15. 粗谈全息投影与裸眼3D
  16. pl/sql插入语句插入数据库中文为????
  17. 大数据系统管理必备技能
  18. Docker初级学习指南
  19. Windows10编译MySQL8.0.28源码
  20. jdk11下载、安装及环境配置详解(win10环境)

热门文章

  1. 【数学基础】矩阵的特征向量、特征值及其含义
  2. POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)
  3. Linux系统CUDA10.2+CUDNN安装教程
  4. 计算机无法还原,降级为Windows 7的计算机无法引导至Windows 10恢复介质
  5. poj1743(后缀数组+二分--不可重叠最长重复子串)
  6. 关于寻路算法的一些思考(3):A*算法的实现
  7. DLL入门浅析(5)——使用DLL在进程间共享数据
  8. Python中的MySQL数据库编程
  9. 设计模式:组合模式(Composite)
  10. 中南大学张昊:我非常期待基于AI的图像视频编码技术的创新