【LeetCode刷题-二分查找】--162.寻找峰值

news2025/1/11 14:26:00

162.寻找峰值

image-20231112104629733

方法一:寻找最大值

题目保证了nums[i]≠nums[i+1],所以数组nums中最大值两侧的元素一定严格小于最大值本身,因此最大值所在的位置就是一个可行的峰值位置

class Solution {
    public int findPeakElement(int[] nums) {
        int idx = 0;
        for(int i=0;i<nums.length;i++){
            if(nums[i] > nums[idx]){
                idx = i;
            }
        }
        return idx;
    }
}

方法二:使二分查找优化迭代爬坡

image-20231112104931752

image-20231112104944213

class Solution {
    public int findPeakElement(int[] nums) {
        int n = nums.length;
        int left = 0,right = n - 1,ans = -1;
        while(left <= right){
            int mid = (left + right) / 2;
            if(compare(nums,mid - 1,mid) < 0 && compare(nums,mid,mid + 1) > 0){
                ans = mid;
                break;
            }
            if(compare(nums,mid,mid + 1)< 0){
                left = mid + 1;
            }else{
                right = mid -1;
            }
        }
        return ans;
    }
    
    // 辅助函数,输入下标 i,返回一个二元组 (0/1, nums[i])
    // 方便处理 nums[-1] 以及 nums[n] 的边界情况
    public int[] get(int[] nums,int idx){
        if(idx == -1 || idx == nums.length){
            return new int[]{0,0};
        }
        return new int[]{1,nums[idx]};
    }

    public int compare(int[] nums,int idx1,int idx2){
        int[] num1 = get(nums,idx1);
        int[] num2 = get(nums,idx2);
        if(num1[0] != num2[0]){
            return num1[0] > num2[0] ? 1:-1;
        } 
        if(num1[1] == num2[1]){
            return 0;
        }
        return num1[1] > num2[1] ? 1:-1;
    }
}

方法三:二分查找

  • 在题目描述中出现了nums[-1]=nums[n]=-∞,就代表着只要数组中存在一个元素比相邻元素大,那么沿着它一定就可以找到一个峰值
  • 根据上述结论,可以使用二分查找找到峰值
  • 查找时,左指针l,右指针r,以其保持左右顺序为循环条件
  • 根据右指针计算中间位置m,并比较m和m+1的值,如果m较大,则左侧存在峰值,r=m,如果m+1较大,则右侧存在峰值,l=m+1
class Solution {
    public int findPeakElement(int[] nums) {
        int left = 0, right = nums.length - 1;
        for (; left < right; ) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > nums[mid + 1]) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
}

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

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

相关文章

desc相关注入

desc相关注入 补充

合并二叉树(Java)

题目描述 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重…

递归和master公式

前置知识&#xff1a;无 1&#xff09;从思想上理解递归&#xff1a;对于新手来说&#xff0c;递归去画调用图是非常重要的&#xff0c;有利于分析递归 2&#xff09;从实际上理解递归&#xff1a;递归不是玄学&#xff0c;底层是利用系统栈来实现的 3&#xff09;任何递归函…

windows上运行yolov3代码详解(小白)

batch_normalize1 # 是否做BN 代码链接 环境配置 没有Anaconda的话可以安装下 首先创建虚拟环境&#xff0c;名称随意&#xff0c;版本3.9.我觉得挺好的 激活虚拟环境 conda activate 刚刚创建的环境名称 切换到requirements.txt目录下&#xff0c;直接vscode打开yolov3文件…

CS224W5.3——信念传播

此文中&#xff0c;我们介绍信念传播&#xff0c;这是一种回答图中概率查询的动态规划方法。通过迭代传递消息给邻居节点&#xff0c;如果达成共识&#xff0c;则计算最终的信念值。然后&#xff0c;我们通过示例和泛化树结构展示消息传递。最后讨论了循环信念传播算法及其优缺…

践行“微”使命——建行江门市分行大力发展普惠金融支持小微企业

促进小微企业发展是保持国民经济高质量发展的重要基础。建行广东省江门市分行立足当地特色产业之需&#xff0c;以金融活水润泽侨乡众多小微企业&#xff0c;携手共赴美好未来。 双向奔赴&#xff0c;添翼高企发展 江门开平水口镇是全国三大水暖卫浴生产基地之一&#xff0c;…

CHM Viewer Star 6.3.2(CHM文件阅读)

CHM Viewer Star 是一款适用于 Mac 平台的 CHM 文件阅读器软件&#xff0c;支持本地和远程 CHM 文件的打开和查看。它提供了直观易用的界面设计&#xff0c;支持多种浏览模式&#xff0c;如书籍模式、缩略图模式和文本模式等&#xff0c;并提供了丰富的功能和工具&#xff0c;如…

队列Queue

结构特点&#xff1a;先进先出实现模式&#xff1a;单向非循环双指针链表 两个指针分别记录头和尾之所以不用循环链表是添加删除元素都在链表头部进行&#xff0c;不涉及尾部增删操作。 声明队列 声明队列之所以要用到两个结构体是因为除了单个链表节点之外&#xff0c;还需要…

神经网络(第二周)

一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征&#xff1a;T恤的价格&#xff1b;分类&#xff1a;销售量高1/销售量低0&#xff1b;使用逻辑回归算法进行分类&#xff0c;拟合效果如下图所示&#xff1a; 1.1.2 神经元和神经网络 将逻辑回…

Java的类与Golang的结构体的区别

Java作为一门面向对象&#xff08;OOP&#xff09;的编程语言&#xff0c;它有类&#xff08;class&#xff09;的存在&#xff0c;而对于Golang&#xff0c;它不完全遵从OOP编程语言的设计思想&#xff0c;但它也有类似Java类的结构存在&#xff0c;那就是结构体&#xff08;s…

数据结构与算法之排序: Leetcode 21. 合并两个有序链表 (Typescript版)

合并两个有序链表 https://leetcode.cn/problems/merge-two-sorted-lists/ 描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 …

【网络奇遇记】电路交换与分组交换谁更 “ 美 ”

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 电路交换1.1 电路交换讲解1.2 电路交换实例 二. 分组交换1.1 分组交换讲解1.2 分组交换实例1.3 …

Producer

Producer开发样例 版本说明 新客 户端, 从Kafka 0.9.x 开始, client基于Java语言实现。同时提供C/C, Python等其他客户端实现。 开发步骤 配置客户端参数以及创建客户端实例;构建待发送消息;发送消息;关闭生产者实例; 代码示例 public class KafkaProducer {public stati…

什么是数据库事务、事务的ACID、怎么设置/禁止自动提交?

数据库事务及ACID 数据库事务是指作为单个逻辑工作单元执行的一组操作。这组操作要么全部成功地执行&#xff0c;要么全部不执行&#xff0c;不允许出现部分执行的情况。数据库事务通常需要满足ACID属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#x…

建行驻江门市分行纪检组以政治谈话压责任促发展

开展政治谈话&#xff0c;是加强“一把手”和领导班子监督、严肃党内政治生活、加强对党员领导干部日常教育管理的有效手段。 为督促“一把手”和领导班子成员依法依规履行职责、行使权力&#xff0c;推动党中央重大决策部署以及建设银行总行、广东省分行党委的决策部署在本单…

SpringBoot学习(黑马程序员day12)

1jwt令牌 JWT的组成&#xff1a; &#xff08;JWT令牌由三个部分组成&#xff0c;三个部分之间使用英文的点来分割&#xff09; 第一部分&#xff1a;Header(头&#xff09;&#xff0c; 记录令牌类型、签名算法等。 例如&#xff1a; {"alg":"HS256",&qu…

Linux各种版本安装详细步骤和root密码破解

文章目录 VMware新建虚拟机硬件设置设置虚拟网络挂载ISO文件 root密码破解 VMware新建虚拟机 硬件设置 设置虚拟网络 编辑>虚拟网络编辑器>VMnet8(NAT模式) 挂载ISO文件 加电>开启次虚拟机 第二项可以检查挂载上来的iso文件是否完整没有破坏 磁盘分区 选自定义分…

Linux应用开发基础知识——字符文字编码(五)

前言&#xff1a; TXT 文件中保存的是字符的核心&#xff1a;它的编码值。而 Notepad 上显示时&#xff0c; 这些字符对应什么样的形状态&#xff0c;这是由字符文件决定的。编码值&#xff0c;字体是两个不一样的东西&#xff0c;比如 A 的编码值是 0x41&#xff0c;但是在屏幕…

用excel计算一个矩阵的转置矩阵

假设我们的原矩阵是一个3*3的矩阵&#xff1a; 125346789 现在求它的转置矩阵&#xff1a; 鼠标点到一个空白的地方&#xff0c;用来存放结果&#xff1a; 插入-》函数&#xff1a; 选择TRANSPOSE&#xff0c;这个就是求转置矩阵的函数&#xff1a; 点击“继续”&#xff1a…

SparkSQL之Rule体系

在Unresolved LogicalPlan逻辑算子树的操作&#xff08;如绑定、解析、优化等&#xff09;中&#xff0c;主要方法都是基于规则&#xff08;Rule&#xff09;的&#xff0c;通过Scala语言模式匹配机制&#xff08;Pattern-match&#xff09;进行树结构的转换或节点改写。Rule是…