【每日一题】852. 山脉数组的峰顶索引

news2024/11/29 22:39:06

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

符合下列属性的数组 arr 称为 山脉数组 :

  • arr.length >= 3
  • 存在 i0 < i < arr.length - 1)使得:
    • arr[0] < arr[1] < ... arr[i-1] < arr[i]
    • arr[i] > arr[i+1] > ... > arr[arr.length - 1]

给你由整数组成的山脉数组 arr ,返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。

你必须设计并实现时间复杂度为 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 是一个山脉数组
class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 0 ;
        int right = arr.length - 1;
        int mid = 0 ;
        while(left < right) {
            mid = (left+right) / 2;
            if(arr[mid-1] < arr[mid] && arr[mid+1] < arr[mid]) break;
            if(arr[mid-1] < arr[mid] && arr[mid+1] > arr[mid]) {
                left = mid;
                continue;
            } else {
                right = mid;
                continue;
            }
        }
        return mid;
    }
}

         每日一题,今天是一道中等题。虽然是中等题,但是实际上难度不高。

        看完题目之后,题目要求我们使用O(log(n))的算法。又是数组,又是O(log(n)),又是查找的题目,属于是buff叠满了。自然就会想到经典的二分查找算法。

        所谓山脉数组,看完题目就知道是数组元素大于3,并且数组中有一个最大数,使得左边的数都小于它,右边的数也都小于它。题目要求我们找出这个数的下标。那自然就想到二分查找,直接一个left记录0,一个right记录右边界,mid记录二分的结果。那二分完无非就几种情况。(1)左边小于arr[mid],右边也小于arr[mid],这种情况就找到了,直接break就行了。(2)左边小于arr[mid],右边大于arr[mid],那这种情况是符合在正确数左边的情况的,说明正确的数在右边,将left=mid继续循环即可。(3)左边大于arr[mid],右边小于arr[mid],这种情况是符合正确数右边的情况的,将right = mid继续循环即可。(4)左边大于arr[mid],右边也大于arr[mid],这种i情况不可能出现,也就没必要讨论了。

        这样就可以解答这道题了。时间复杂度为O(log(n))。如果大家有其他解法,也可以发在评论区。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux重装qemu和libvirt

要重装qemu和libvirtd在CentOS上&#xff0c;请按照以下步骤操作&#xff1a; 首先&#xff0c;请确保您具有root权限或sudo访问权限。 首先&#xff0c;您需要卸载现有的qemu和libvirt软件包。使用以下命令&#xff1a; sudo yum remove qemu-kvm qemu-img libvirt在卸载完成…

MySQL基础终端命令与Python简单操作MySQL

文章目录 MySQL终端命令1. 进入mysql2. 创建数据库3. 选择数据库4. 创建数据表1. 主键约束2. 外键约束3. 非空约束4. 唯一约束5. 使用默认约束6. 设置id为自增列 5. 查看数据表6. 修改数据表1. 修改表名2. 修改表的字段类型3. 修改表的字段名4. 为表添加字段5. 删除字段6. 调整…

HTML的学习 Day01

《网页设计与制作》是web前端开发技术中静态网页中的内容&#xff0c;主要包括html、css、js中的静态内容部分&#xff0c;是专业基础课程。 随着5G时代的到来&#xff0c;人工智能与物联网结合行业的飞速发展&#xff0c;更多的互联网的崛起。这肯定就比如伴随着对移动互联网…

05-Redis高可用集群之水平扩展

上一篇&#xff1a;04-Redis哨兵高可用架构 1.概要说明 Redis3.0以后的版本虽然有了集群功能&#xff0c;提供了比之前版本的哨兵模式更高的性能与可用性&#xff0c;但是集群的水平扩展却比较麻烦&#xff0c;今天就来带大家看看redis高可用集群如何做水平扩展&#xff0c;…

Houdini 灯光插件工作流程,如何将 HDR Light Studio 与 Houdini 结合使用?

如何不额外购买硬件&#xff0c;流畅的运行Houdini&#xff1a; Houdini项目渲染慢&#xff0c;本地硬件配置不够&#xff0c;想要加速渲染&#xff0c;在不增加额外的硬件成本投入的情况下&#xff0c;最好的解决方式是使用渲云云渲染&#xff0c;在云端批量渲染&#xff0c;…

高效通过指定秒数分割视频,定制你的片段!

大家好&#xff01;在处理电脑上的视频文件时&#xff0c;如果需要从指定秒数处进行分割视频&#xff0c;传统的方法可能会显得非常繁琐和费时。为了让您能够轻松实现这一需求&#xff0c;我们为您提供了一种高效的方法&#xff0c;让您能够精准地从指定秒数处分割视频&#xf…

出现线程安全问题的原因和解决方案

文章目录 一、什么是线程安全问题二、出现线程安全问题的原因三、解决方案3.1加锁 一、什么是线程安全问题 某些代码在单线程环境下执行结果完全正确&#xff0c;但在多线程环境下执行就会出现Bug&#xff0c;这就是“线程安全问题”。 下面以一个变量n自增两次&#xff0c;每…

Linux【一】

目录 一、Linux操作系统发展历史 Unix Minix Linux 二、Linux简介 Linux是什么 Linux的版本 Linux内核版本 Linux发行版本 Linux应用领域&#xff1f; Linux注意事项 三、Linux目录 系统目录 用户目录 文件颜色 四、Linux命令行基本操作 Linux命令格式&#x…

小程序中会员如何绑定身份证信息

在小程序中&#xff0c;会员绑定身份证信息是一项重要且常见的功能&#xff0c;可以帮助商家更好地了解用户的身份信息&#xff0c;提供个性化的服务和保障用户的权益。例如生日礼物&#xff0c;还有以及医保支付等需要实名认证的场景等。下面将介绍一些小程序中会员如何绑定身…

Open Feign

Open Feign 在前面的学习中&#xff0c;我们使用了Ribbon的负载均衡功能&#xff0c;简化了远程调用时的代码&#xff1a; String user this.restTemplate.getForObject("http://spring-provider/provider/" id, String.class);如果就学到这里&#xff0c;可能以…

Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来

在 9 月 7 日&#xff0c;Zebec 创始人 Sam 做客社区&#xff0c;并进行了“Nautilus Chain 以及 $ZBC 的未来”主题的 AMA 访谈。Sam 在本次访谈中对 Nautilus Chain 生态的价值捕获、Zebec 生态布局规划、可能会推出的 Nautilus Chain 治理通证 NAUT 进行了解读。本文将对本次…

基于SSM的医院在线挂号预约系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

人大女王金融硕士项目——应以长远的眼光去规划自己的人生蓝图

我们的现在的生活都是过去努力的结果&#xff0c;你的未来如何是由今后的努力决定。我们不要停滞不前&#xff0c;应从长远的眼光去规划自己的人生蓝图。你有想过在职攻读人民大学与加拿大女王大学金融硕士项目来提升自己吗&#xff1f; 着我国经济迅猛的发展&#xff0c;金融…

鸿蒙HarmonyOS应用开发初体验

最近华为发布mt60新机火了&#xff0c;作为一名移动开发程序员&#xff0c;对鸿蒙系统开发移动端就很感兴趣了。 开发工具&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 下载完后按默认安装就可以了&#xff0c;界面跟AS很类似&#xff0c;之前我jdk环…

前端面试合集(二)

前端面试题合集 1.懒加载的原理及实现了解吗2.如何理解JS异步3.阐述一下 JS 的事件循环4.JS 中的计时器能做到精确计时吗&#xff1f;为什么&#xff1f; 1.懒加载的原理及实现了解吗 原理&#xff1a;当图片没有到达可视范围内时&#xff0c;图片不加载&#xff0c;当图片一旦…

【Realtek sdk-3.4.14b】RTL8197FH-VG和RTL8812F自适应认证失败问题分析及修改

WiFi自适应认证介绍 WiFi 自适应可以理解为针对WiFi的产品,当有外部干扰信号通过,WiFi产品自动停止发出信号一段时间,以达到避让的目的。 问题描述 2.4G和5G WiFi自适应认证失败,信道停止发送信号时间过长,没有在规定时间内停止发包 2.4G截图 问题分析 根据实验室描述可以…

yolov7简化网络yaml配置文件

yolov7代码结构简单&#xff0c;效果还好&#xff0c;但是动辄超过70几个模块的配置文件对于想要对网络进行魔改的朋友还是不怎么友好的&#xff0c;使用最小的tiny也有77个模块 代码的整体结构简单&#xff0c;直接将ELAN结构化写成一个类就能像yolov5一样仅仅只有20几个模块&…

[H5动画制作系列] 奔跑的豹子的四种Demo演化

资源: bg.jpg: leopard.png: 背景透明 peopard2.png 背景不透明 参考代码1: leopard.js: (function(window) {ma = function() {this.initialize();}ma._SpriteSheet = new createjs.SpriteSheet({images: ["leopard.png"], frames: [[0,0,484,207],[486,0,484,20…

H5唤醒App

H5唤醒App 在App的业务场景中&#xff0c;H5唤醒App是一个几乎必备的功能。比如你想要实现以下需求&#xff1a;当App内容通过各种途径&#xff08;短信、二维码、微信等&#xff09;触达用户&#xff0c;从浏览器或者第三方内部可以直接打开H5网页&#xff0c;由网页端交互操作…

线性代数的本质(十)——矩阵分解

文章目录 矩阵分解LU分解QR分解特征值分解奇异值分解奇异值分解矩阵的基本子空间奇异值分解的性质矩阵的外积展开式 矩阵分解 矩阵的因式分解是把矩阵表示为多个矩阵的乘积&#xff0c;这种结构更便于理解和计算。 LU分解 设 A A A 是 m n m\times n mn 矩阵&#xff0c;…