【LeetCode】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(logN) ,这就几乎摆明了要用二分搜索了。
但是常规的二分搜索是要搜索一个特定的,具体的元素在集合中的位置,在这一题中要找的元素并不是一个具体的值,而是一个具有某种特征(峰值)的值,如何将二分法转换一下运用到这里呢?
与传统的二分搜索设置一个mid
指针不同的是,我们设置两个,mid1
和mid2
,来保证边界的外侧总是小于边界的,这样通过边界更新,我们可以保证递归/迭代会在局部峰值处结束。
Java 实现
递归实现
public int findPeakElement (int[] nums) {return helper(nums, 0, nums.length - 1);
}private int helper (int[] nums, int lo, int hi) {if (lo == hi) {return lo;} else {int mid1 = (lo + hi) / 2;int mid2 = mid1 + 1;if (nums[mid1] > nums[mid2]) {return helper(nums, lo, mid1);} else {return helper(nums, mid2, hi);}}
}
迭代实现
public int findPeakElement (int[] nums) {return helper(nums, 0, nums.length - 1);
}private int helper (int[] nums, int lo, int hi) {while (lo < hi) {int mid1 = (lo + hi) / 2;int mid2 = mid1 + 1;if (nums[mid1] < nums[mid2]) {lo = mid2;} else {hi = mid1;}}return lo;
}
心得体会
二分搜索是根据mid1
,mid2
的关系对搜索区域进行调整的,确保边界外侧小于边界,从而确保最后在局部峰值处结束递归/迭代。
转载于:https://www.cnblogs.com/yuzhenzero/p/10470980.html
【LeetCode】162-寻找峰值相关推荐
- java 寻找峰值峰谷_Java实现 LeetCode 162 寻找峰值
162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返 ...
- LeetCode 162. 寻找峰值(二分查找)
1. 题目 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...
- LeetCode 162. 寻找峰值
为什么二分查找大的那一半一定会有峰值呢?(即nums[mid]<nums[mid+1]时,mid+1~N一定存在峰值) 我的理解是,首先已知 nums[mid+1]>nums[mid],那 ...
- Leetcode 162. 寻找峰值 解题思路及C++实现
解题思路: 这道题应该归为简单,只要找到第一个降序的值就可以了. class Solution { public:int findPeakElement(vector<int>& ...
- python寻峰,[LeetCode][Python]162. 寻找峰值
[LeetCode][Python]162. 寻找峰值 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数 ...
- leetcode刷题 162.寻找峰值
题目分析: 通过题目,我们发现这题的本质是寻找一段数组范围内的最大值,我们可以通过不断的缩小数组范围来寻找目标值,由缩小数组范围我们可以联想到二分查找,但是此二分查找有一不同点,就是中值不是同左右界值 ...
- 【LeetCode笔记】162. 寻找峰值(Java、二分、偏数学)
文章目录 题目描述 思路 && 代码 1. 暴力法 O(n) 2. 二分法 O(logN) 二刷 打卡第十七天- 题目描述 难点在于 logN 复杂度 思路 && 代码 ...
- leetcode 162. Find Peak Element | 162. 寻找峰值(二分法找局部最大值)
题目 https://leetcode.com/problems/find-peak-element/ 题解 2021-7-21 16:28:31 更新版思路: 根据左神在 课上 说的,可以使用二分法 ...
- python寻峰,LeetCode-python 162.寻找峰值
题目链接 难度:中等 类型: 数组 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包 ...
- leetcode 寻找峰值
162. 寻找峰值 峰值元素是指其值严格大于左右相邻值的元素. 给你一个整数数组 nums,找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可. 你可以假设 ...
最新文章
- 跨链(8)Cosmos之“跨链交互协议IBC”前言
- IJCAI 2019 论文解读 | 基于超图网络模型的图网络进化算法
- 局域网连接SQL Server数据库配置
- 工业机器人 扬州 江都_扬州市14家企业获批2019年江苏省示范智能车间
- Guava之RangeMap
- erlang有前途吗_带有示例的Erlang概述
- 帆软报表重要Activator之DesignerStartup
- Maven如何手动添加jar包到本地Maven仓库
- java oracle spool,oracle之spool详细使用总结
- org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.
- 【论文译文】BigGAN
- 计算机快速录入,如何快速把书中的文字扫描并录入电脑
- 【宋红康 MySQL数据库 】【高级篇】【10】索引的创建与删除_MySQL8.0的索引新特性
- WORD导出PDF生成书签
- Android:SQLite数据库学习小结
- java创建短信平台_Java通过SMS短信平台实现发短信功能
- SIMCom芯片关于GPS定位信息的的解析(AT+CGNSINF)
- Mysql数据库可视化工具Navicat使用
- 用java做出长方体的表面积_编写java程序,输入一个长方体的长、宽、高,求长方体的表面积和体积,并将结果显示,一个长方体的...
- 黑马程序员_网络电视用中国电信路由器不能联网的问题
热门文章
- Reflector:.NET反编译工具及导出CS文件插件
- 2017.11.24 Stm8L151-factory
- 云端模糊测试挖洞实例
- c#调用c++ dll的一个例子
- 在centos6.5上编译安装httpd-2.4和2.4版本特性介绍
- 如何做一个让开发人员看得起的软件测试人员
- CleanMyMac X2021专业苹果电脑系统优化工具
- Spring的Controller是单例还是多例,怎么保证并发的安全
- 某生鲜平台面试题:如何保证库存在高并发的场景下是安全的?
- 百度开源移动端深度学习框架mobile-deep-learning(MDL)