leetcode 162. Find Peak Element | 162. 寻找峰值(二分法找局部最大值)
题目
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. 寻找峰值(二分法找局部最大值)相关推荐
- LeetCode:Find Peak Element - 寻找一个数组内的顶点
2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Find Peak Element(寻找一个数组内的顶点) 2.题目地址 https://leetcode.co ...
- leetcode 【 Find Peak Element 】python 实现
题目: A peak element is an element that is greater than its neighbors. Given an input array where num[ ...
- 162. Find Peak Element
文章目录 1 题目理解 2 线性扫描 3 递归二分查找 1 题目理解 输入:int[] nums并且 nums[i]!=nums[i+1] 输出:找到称为峰值的那个数字,返回其下标. 规则:峰值是指: ...
- 寻找峰值(局部最大、局部最小)——二分查找
寻找峰值 也就是局部最大,可以采用二分法来实现.当然局部最小也一样. 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况 ...
- python寻峰,[LeetCode][Python]162. 寻找峰值
[LeetCode][Python]162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数 ...
- java 寻找峰值峰谷_Java实现 LeetCode 162 寻找峰值
162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返 ...
- 11 寻找峰值(Find Peak Element)
文章目录 1 题目 2 描述 3 思路 3.1 图解 3.2 时间复杂度 3.3 空间复杂度 4 源码 1 题目 寻找峰值(Find Peak Element) lintcode:题号--75,难 ...
- 算法系列——寻找峰值 (Find Peak Element)
题目描述 题目链接:https://leetcode-cn.com/problems/find-peak-element/ A peak element is an element that is g ...
- leetcode 寻找峰值
162. 寻找峰值 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 ...
最新文章
- Linux系统轻量级监控工具monitorix和munin安装
- 给VIM安装YouCompleteMe插件
- UVa455 Periodic Strings(kmp)
- echarts 中 symbol 自定义图片
- Team Foundation Server 2010 安装、部署与配置(六):创建 Team Project .
- oracle12输出文件性能慢,输出选项 (Oracle Solaris Studio 12.2:性能分析器)
- 关于零基础学习web前端开发,有些过来经验分享
- OPEN(SAP) UI5 学习入门系列之四:更好的入门系列-官方Walkthrough
- Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题
- resnet18实现cifar10分类
- #转载汉化 用C++写出来的人工智能围棋游戏
- 用计算机求平方根立方根,利用计算器求平方根、立方根
- android 模拟器装apk,如何在Android模拟器中安装apk文件
- 小程序 打开地图导航
- 粗谈全息投影与裸眼3D
- pl/sql插入语句插入数据库中文为????
- 大数据系统管理必备技能
- Docker初级学习指南
- Windows10编译MySQL8.0.28源码
- jdk11下载、安装及环境配置详解(win10环境)
热门文章
- 【数学基础】矩阵的特征向量、特征值及其含义
- POJ - 2175 Evacuation Plan(最小费用最大流+消圈定理)
- Linux系统CUDA10.2+CUDNN安装教程
- 计算机无法还原,降级为Windows 7的计算机无法引导至Windows 10恢复介质
- poj1743(后缀数组+二分--不可重叠最长重复子串)
- 关于寻路算法的一些思考(3):A*算法的实现
- DLL入门浅析(5)——使用DLL在进程间共享数据
- Python中的MySQL数据库编程
- 设计模式:组合模式(Composite)
- 中南大学张昊:我非常期待基于AI的图像视频编码技术的创新