目录

1. 寻找峰值

1.1 题目解析

1.2 解法

1.3 代码实现

2. 山脉数组

2.1 题目解析

2.2 解法

2.3 代码实现


1. 寻找峰值

162. 寻找峰值 - 力扣(LeetCode)

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

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

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

你必须实现时间复杂度为 O(log 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。

提示:

  • 1 <= nums.length <= 1000
  • -231 <= nums[i] <= 231 - 1
  • 对于所有有效的 i 都有 nums[i] != nums[i + 1]

1.1 题目解析

  • 目标:在“严格先升后降”的山脉数组中找到唯一峰顶下标 i,满足
    arr[0] < … < arr[i-1] < arr[i] > arr[i+1] > … > arr[n-1]。

  • 关键结构(可二分的二段性):定义性质 P(k) := arr[k] > arr[k-1](是否还在上坡)。 在区间 k ∈ [1, n-2] 上,P(k) 呈先真后假:峰顶及其左侧为真,峰顶右侧为假。 因此问题等价于:在 [1, n-2] 中找“最后一个使 P(k) 为真”的位置 → 即峰顶。

  • 搜索区间:为避免越界并且不丢解,取 [1, n-2](峰不在两端,且要访问 k-1)。

  • 收敛策略:配合“上中位数”与单侧保留(上坡保留 mid),保证每轮缩小区间,最终 left == right。

  • 复杂度:时间 O(log n),空间 O(1)。

1.2 解法

i)对 P(k) := arr[k] > arr[k-1] 做“最后一个真”的二分查找

ii)若 arr[mid] > arr[mid-1](上坡/在峰左侧或即将到峰),峰一定在 [mid, right],令 left = mid(保留 mid)。

iii)否则(下坡),峰一定在 [left, mid-1],令 right = mid - 1。

iiii)用上中位数避免死循环;终止时 left == right 即峰顶。

正确性要点

  • 不变量:每轮后峰顶始终在 [left, right]。

  • 收敛性:上中位数 + 上坡时 left = mid 保证区间严格缩小。

  • 复杂度:O(log n) / O(1)。

1.3 代码实现

class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 1, right = arr.length - 2; // 峰不在两端,且要用到 mid-1while (left < right) {int mid = left + (right - left + 1) / 2; // 上中位数if (arr[mid] > arr[mid - 1]) {left = mid;          // 上坡:峰在 [mid, right]} else {right = mid - 1;     // 下坡:峰在 [left, mid-1]}}return left; // 即峰顶索引}
}

2. 山脉数组

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。

返回峰值元素的下标。

你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。

示例 1:

输入:arr = [0,1,0]
输出:1

示例 2:

输入:arr = [0,2,1,0]
输出:1

示例 3:

输入:arr = [0,10,5,2]
输出:1

提示:

  • 3 <= arr.length <= 105
  • 0 <= arr[i] <= 106
  • 题目数据 保证 arr 是一个山脉数组

2.1 题目解析

  • 目标:在“严格先升后降”的数组(山脉数组)里找到峰顶下标 i,满足 arr[0] < ... < arr[i-1] < arr[i] > arr[i+1] > ... > arr[n-1]。 峰值不在两端,且一定唯一。

  • 本质:这是在上升段下降段的分界点上找位置。 设性质 P(k) := arr[k] > arr[k-1](“还在上坡”)。 在山脉数组中::

    • 峰顶及其左侧:P(k) 恒为 (还在上坡或刚到顶的左侧观察点)。

    • 峰顶右侧:P(k) 恒为 (已经下坡)。因而在区间 k ∈ [1, n-1],P(k) 呈现先真后假的“二段性”。我们要找的就是“最后一个使 P(k) 为真”的 k,它正是峰顶索引。

  • 为何能用二分:有了“先真后假”的结构,就能用二分在 P(k) 上做“找最后一个真”。这比线性扫描把复杂度从 O(n) 降到 O(log n)。

  • 边界与越界:为了比较 arr[mid] 与 arr[mid-1],mid 最小得是 1; 又因为峰不在两端,最大可到 n-2。 所以把搜索区间定为 [1, n-2],既不丢解也不越界。

  • 三种位置类型与判断
    从“趋势”角度看,mid 可能在:

    1. 上升段:arr[mid] > arr[mid-1](继续上坡)

    2. 下降段:arr[mid] < arr[mid-1](已下坡)

    3. 峰顶:满足 arr[mid] > arr[mid-1] && arr[mid] > arr[mid+1] 实际实现里只用“与左邻比较”也足够:峰顶在“与左邻比较为真”的那一段的最右端,所以按“找最后一个真”就能把指针收敛到峰顶;无需显式判断右邻。

2.2 解法

i)在闭区间 left = 1, right = n-2 上二分(峰不在两端,且我们要用到 arr[mid-1])。

ii)取上中位数:mid = left + (right - left + 1) / 2。

iii)若 arr[mid] > arr[mid - 1](仍在上坡),则峰一定在 [mid, right],令 left = mid。

iiii)否则(已在下坡),峰一定在 [left, mid - 1],令 right = mid - 1。

iiiii)直到 left == right,即为峰顶索引,返回之。

正确性要点

  • 不变量:峰顶始终在 [left, right]。

    • 上坡保留 [mid, right] 不丢峰;

    • 下坡保留 [left, mid-1] 不丢峰。

  • 收敛性:选“上中位数”并在上坡时赋 left = mid,保证区间严格缩小,终将 left == right。

  • 复杂度:时间 O(log n),空间 O(1)。

2.3 代码实现

class Solution {public int peakIndexInMountainArray(int[] arr) {int n = arr.length;int left = 1, right = n - 2; // 峰不在两端,且需访问 arr[mid-1]while (left < right) {int mid = left + (right - left + 1) / 2; // 上中位数if (arr[mid] > arr[mid - 1]) {// 上坡:峰在 [mid, right],保留 midleft = mid;} else {// 下坡:峰在 [left, mid-1],丢弃 midright = mid - 1;}}return left; // 或 right}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93470.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93470.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93470.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cherryusb UAC例程对接STM32 SAI播放音乐和录音(下)=>USB+SAI+TX+RX+DMA控制WM8978播放和录音实验

1. 程序基本框架 整个程序框架, 与之前的一篇文章《Cherryusb UAC例程对接STM32内置ADC和DAC播放音乐和录音(中)>UACSTM32 ADCDAC实现录音和播放》基本一致, 只是这次将ADC和DAC替换成了SAI TX/RX。因此这里不再赘述了。2. sai_dma_wm8978_usb.c主程序的实现说明 在menuconf…

Docker运行python项目:使用Docker成功启动FastAPI应用

根据昨天成功使用阿里云镜像加速后&#xff0c;我是根据windows本地的python项目&#xff0c;直接传到了centos&#xff0c;然后再导入到docker里面&#xff0c;然后进行运行&#xff0c;主要是发现运行的时候&#xff0c;老是提示一些库的问题&#xff0c;还有就是一些python老…

PowerShell来关闭 Windows 安全中心

你可以使用 PowerShell 来关闭 Windows 安全中心的盾牌图标&#xff08;通知&#xff09;。以下是几种方法&#xff0c;包括禁用通知、关闭 Windows Defender&#xff08;不推荐&#xff09;或调整注册表。方法 1&#xff1a;禁用 Windows 安全中心通知&#xff08;推荐&#x…

基于深度学习的老照片修复系统

背景随着时间的推移&#xff0c;老照片可能会因褪色、损坏或曝光不当而影响其视觉质量。这些珍贵的影像承载着历史和回忆&#xff0c;但由于物理损耗&#xff0c;它们的观赏价值和可读性逐渐下降。为了恢复这些照片的清晰度和色彩&#xff0c;本项目采用深度学习与先进的图像处…

深入解析Tomcat目录结构

Apache Tomcat 是一个强大的 Servlet 容器,它不仅支持 Java Servlet 和 JSP 技术,还提供了丰富的功能来帮助开发者构建和部署动态的 Web 应用。为了更好地理解和使用 Tomcat,了解其文件结构和组成部分是至关重要的。本文将深入探讨 Tomcat 的目录结构及其各个组件的作用。 …

专题:2025抖音电商与微短剧行业研究报告|附150+份报告PDF汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43595 当618大促的硝烟散去&#xff0c;抖音电商的生态分化愈发刺眼&#xff1a;服饰内衣以27.5%的份额稳坐头把交椅&#xff0c;而无数中小商家却在“流量荒”中挣扎。这场看似繁荣的盛宴里&#xff0c;平台规则如同无形的手&#x…

3.Ansible自动化之-编写和运行playbook

3.Ansible编写和运行 Playbook Playbook 介绍 如果把 Ansible 的ad-hoc命令比作 “一次性脚本”&#xff08;适合临时执行单个简单任务&#xff09;&#xff0c;那么Playbook就是 “可重复执行的程序”&#xff08;适合复杂、多步骤的管理流程&#xff09;。 举个例子&#…

Vue实时刷新,比如我提交审核,审核页面还需要点查询才能看到最新数据

refreshTimer: null,lastRefreshTime: null}; }, created() {console.log(组件创建&#xff0c;初始化数据...);this.loadLatestData();this.setupAutoRefresh(); }, activated() {// 当使用keep-alive时&#xff0c;组件激活时刷新数据console.log(组件激活&#xff0c;刷新数…

Docker入门:容器化技术的第一堂课

Docker入门&#xff1a;容器化技术的第一堂课 &#x1f31f; 你好&#xff0c;我是 励志成为糕手 &#xff01; &#x1f30c; 在代码的宇宙中&#xff0c;我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光&#xff0c;在逻辑的土壤里生长成璀璨的银河&#…

【SLAM】不同相机模型及其常见的链式求导推导

【SLAM】不同相机模型及其常见的链式求导推导1. 鱼眼相机模型链式求导1. 鱼眼相机畸变模型2. 雅可比矩阵的推导畸变坐标相对于归一化坐标的雅可比矩阵 Hdz/dznH_{dz/dzn}Hdz/dzn​畸变坐标相对于相机内参的雅可比矩阵 Hdz/dzetaH_{dz/dzeta}Hdz/dzeta​3. 注意4. 输入输出含义5…

【人工智能】本地部署 KTransformers并加载大模型笔记

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

TDengine IDMP 高级功能(3. 概念解释)

枚举集 为提升数据的可阅读性&#xff0c;IDMP 为数据提供枚举类型。您可以将一些整型数定义为一具有可读性的字符串。与其他软件一样&#xff0c;您可以定义多个枚举集&#xff0c;每个枚举集可以有多个枚举量。您可以增加、删除、修改、查询枚举集与枚举量。 但独特的是&am…

CUDA 入门教程(GPT优化版)

学习路径 一、环境准备与快速入门 搭建开发环境 ○ 安装 CUDA Toolkit,适用于 Windows(如 Visual Studio)或 Linux,确保你的设备为 NVIDIA GPU 并支持 CUDA。(wholetomato.com) ○ 如果你偏好轻量工具,也可用 VS Code + Nsight 开发环境进行 CUDA 编程。(wholetomato.com)…

react项目性能优化的hook

前言&#xff1a;在项目中开发中&#xff0c;性能优化是很重要的&#xff0c;react有提供专门的hook&#xff0c;useMemo 和useCallback 这里说一说他们。区别&#xff1a;特性useMemouseCallback返回值缓存一个 值&#xff08;计算结果&#xff09;缓存一个 函数依赖变化时重新…

Docker(springcloud笔记第三期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录镜像与容器一些命令与镜像命名规范数据卷自定义镜像Dockerfile镜像与容器 当我们利用Docker安装应用时&#xff0c;Docker会自动搜索并下载应用镜像(image),镜像不仅包含应用本身&…

MySQL定时任务详解 - Event Scheduler 事件调度器从基础到实战

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

redis存储原理与对象模型

redis中的不同线程 redis单线程是指什么&#xff1f; redis的所有命令处理都在同一个线程中完成 redis为什么采用单线程&#xff1f; redis中存在多种数据结构存储value&#xff0c;如果采用多线程&#xff0c;加锁会很复杂、加锁力度不阿红控制&#xff0c;同时&#xff0c…

基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统

基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统

安全审计-iptales防火墙设置

文章目录一、iptales防火墙设置1.ip规则设置2.ip端口规则设置3.删除规则4.INPUT默认设置5.ping、本地访问规则6.保存还原规则7.查看清除规则一、iptales防火墙设置 1.ip规则设置 #允许ip访问本服务器 iptables -I INPUT -s 192.168.205.129 -p tcp -j ACCEPT#允许某IP或某网段…

Linux小白加油站,第二周

1.grep命令中哪个选项可以忽略大小写进行搜索?grep -i 2.如何用grep命令查找包含”error关键字的日志文件并返回文件名?grep -lr3.解释grep命令中^f...d$这个表达式的含义^f&#xff1a;以f开头..&#xff1a;任意两个字符d$&#xff1a;以d结尾4.如何过滤掉文件中的注释行以…