当前位置: 首页 > news >正文

LeetCode 162.寻找峰值

思路:

1.题目规定了nums[-1] = nums[n] = -∞,也就是假设nums[0]的左边还有一个-∞,nums[n - 1]的右边还有一个-∞。原因在于这样可以保证数组一定有峰值。比如数组是严格递减的,那么nums[0]就是(唯一的)峰值;同理如果数组是严格递增的,那么nums[n - 1]就是(唯一的)峰值

2.分析:如果i < n - 1且nums[i] < nums[i + 1],那么在下标[i + 1,n - 1]中一定存在峰值(如果不满足,那么一定有nums[i + 1] < nums[i + 2],nums[i + 2] < nums[i + 3],...,nums[n - 1] < nums[n] = -∞,可知不成立,因此在下标[i + 1,n - 1]中一定存在峰值)。同理可知如果i < n - 1且nums[i] > nums[i + 1],那么在下标[0,i]中一定存在峰值

3.因此,可以通过二分的方式,通过比较nums[i]和nums[i + 1]的大小关系,不断地缩小存在峰值的范围,二分找到峰值

4.注意:如果有多个峰值,我们无法在一开始、以及二分过程中就确定哪个峰值最终会成为答案。二分的思路只是不断地缩小范围,并最终找到其中的一个峰值。由于每次只关注mid和mid + 1的局部大小关系,然后根据这个局部信息决定是向左还是向右。不同的数组初始状态会导致算法走向不同的峰值。因此得到的峰值不一定是全局最高峰

5.复杂度分析:

(1)时间复杂度:O(logn),其中n为nums的长度。

(2)空间复杂度:O(1)。

附代码:

class Solution { public int findPeakElement(int[] nums) { int left = 0; int right = nums.length - 1; // 闭区间[0,n - 1] while (left < right) { // 此时区间至少还有两个元素 int mid = left + (right - left) / 2; if (nums[mid] > nums[mid + 1]) { // 下坡,峰顶位置 <= mid right = mid; } else { // 上坡,峰顶位置 >= mid + 1 left = mid + 1; } } return left; } }

ACM模式:

import java.util.Scanner; class Solution { public int findPeakElement(int[] nums) { int left = 0; int right = nums.length - 1; // 闭区间[0, n - 1] while (left < right) { // 此时区间至少还有两个元素 int mid = left + (right - left) / 2; if (nums[mid] > nums[mid + 1]) { // 下坡,峰顶位置 <= mid right = mid; } else { // 上坡,峰顶位置 >= mid + 1 left = mid + 1; } } return left; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取数组长度 int n = scanner.nextInt(); // 读取数组元素 int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); } // 寻找峰值元素 Solution solution = new Solution(); int result = solution.findPeakElement(nums); System.out.println(result); scanner.close(); } }
http://www.jsqmd.com/news/742437/

相关文章:

  • CAPL脚本自动化进阶:如何动态生成带外部链接和配置信息的Vector测试报告?
  • ESP8266 AP模式避坑指南:手把手教你解决与App Inventor通信中的5个常见问题
  • 别再手动改了!EndNote文献类型缩写对照表(含M/J/D等)一键导入教程
  • WorkshopDL:3步解决跨平台游戏模组下载难题的技术方案
  • ARM ETMv4跟踪单元架构与调试技术详解
  • 可编程直流电源核心技术解析与应用实践
  • 完全指南:深度解析Zotero SciPDF插件在Zotero 7中的5种高效解决方案
  • 大模型训练中的数据处理优化与长文档处理技术
  • Adobe Dreamweaver
  • 告别复制粘贴:深入解读OSG官方osgQt模块的CMake配置与GraphicsWindowQt核心类
  • 零样本学习在物体方向与对称性识别中的应用
  • POWSM:语音与文本统一处理的开源技术解析
  • 从下载到桌面图标:嘉立创EDA专业版Windows安装全记录(附E盘路径设置技巧)
  • AssetRipper:从Unity游戏文件中提取资源的5个关键步骤与实战指南
  • GD32F103虚拟串口(CDC)移植避坑指南:从Demo到项目集成的关键三步
  • 2026矿山移动卸料小车除尘设备厂家推荐:滤筒除尘设备、焊接烟气除尘器、焦化厂除尘设备、熔铝炉除尘器、环保除尘设备选择指南 - 优质品牌商家
  • N_m3u8DL-CLI-SimpleG:5分钟快速掌握M3U8视频下载的终极指南
  • 虚拟机玩家必备:用Clonezilla+网络克隆,5分钟搞定Linux虚拟机的无损复制与迁移
  • 豆包大模型定价0.0008元/千Tokens,实测一元钱能买多少算力?附主流模型价格对比表
  • 告别推流失败:手把手教你编译带RTSP/RTMP支持的FFmpeg(避坑libx264和动态库)
  • MCP-Maker:零代码构建AI数据接口,连接Claude与数据库
  • 自动化机器人框架设计:从任务流到生产部署的完整实践
  • 避坑指南:ABB伺服驱动E3口网络连接与MINT Workbench扫描失败的5个常见原因及解决办法
  • 从AXI3升级到AXI4?手把手教你处理协议变更点与系统兼容性
  • 字节高频题 小于n的最大数
  • 第15篇:Vibe Coding时代:LangChain RAG 检索质量优化实战,解决 Agent 读错文档、答非所问问题
  • 基于MCP协议的物流货运智能体:从非结构化单据到结构化数据的实战指南
  • 别只怪Termux!Kali Nethunter里nmap用不了的深层原因与权限限制分析
  • 大模型推理黑科技:为什么AI有时候秒回有时候卡?
  • 基于MCP协议连接GitLab与AI:实现私有代码库的智能编程助手