【刷题】 二分查找进阶

在这里插入图片描述

送给大家一句话:
你向神求助是因为相信神,神没有回应你是因为神相信你

ε≡٩(๑>₃<)۶ ε≡٩(๑>₃<)۶ ε≡٩(๑>₃<)۶ 一心向学


二分查找进阶

  • 1 前言
  • Leetcode 852. 山脉数组的峰顶索引
    • 题目描述
    • 算法思路
  • Leetcode 162. 寻找峰值
    • 题目描述
    • 算法思路
  • Leetcode 153. 寻找旋转排序数组中的最小值
    • 题目描述
    • 算法思路
  • Leetcode LCR 173. 点名
    • 题目描述
    • 算法思路
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见

1 前言

二分查找的算法思想是很好理解的。朴素二分很容易,但一般常使用左端点查找与右端点查找来解决问题。
模版:

        int left = 0 , right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;//int mid = left + (right - left + 1) / 2;if(  // 判断条件 ){left = mid + 1;//left = mid }else{right = mid;// right = mid - 1}}return left;//return right ;
  1. while()循环条件是left < right !
  2. 注意对应关系。right里有 -1 那么对应的求中值就要有+1。把握这个规律,就不会弄乱了

下面来看几道例题,强化训练二分查找的算法思路!通过这些题的训练,就可以很熟悉二分查找算法的思想,以后遇到问题就多了一种解决手段!!!

Leetcode 852. 山脉数组的峰顶索引

上链接:852. 山脉数组的峰顶索引!!!

题目描述

在这里插入图片描述
首先我们要理解什么是山峰数组,根据题目的描述,山峰数组就是先升再下降的数组。我们要在其中寻找峰值的索引。这个问题看起来看还是挺简单的

算法思路

首先我们要判断该数组是否存在二段性???
当然有了!

  • 以峰值为分割,左边都是nums[n] < nums[n + 1] 右边都是nums[n] > nums[n + 1]

通过这个二段性我们可以来进行二分查找:

  1. 如果中值落在左边,那么left 应该 移动到 mid + 1(因为nums[n] < nums[n + 1] ,mid对应的值一定不是峰值)
  2. 如果中值落在右边,那么right 应该 移动到 mid(因为nums[n] > nums[n + 1] ,mid对应的值有可能是峰值)

有了思路,代码很简单就可以写出来,直接套用模版。

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int mid = 0;int left = 0 , right = arr.size() - 1 ;while( left < right  ){mid = left + (right - left + 1) / 2;if(arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1]){return mid;}if(arr[mid] > arr[mid - 1]){left = mid;}else{right = mid - 1;}}return mid;}
};

提交:过啦!!!!

Leetcode 162. 寻找峰值

家人们!!!跟上节奏:162. 寻找峰值

题目描述

在这里插入图片描述
这道题是上面求峰值索引的变形。这道题具有多个封值(换句话说数组是无序的),那么我们要在无序的数组寻找一个峰值。

算法思路

首先我们来看可不可以判断出来数组的二段性。和求峰值索引一样:

  • 以其中一个峰值为分割,左边一部分是nums[n] < nums[n + 1] 右边一部分是nums[n] > nums[n + 1]

那么根据这个二段性也就是可以写出算法逻辑了:

  1. 如果中值落在左边,那么left 应该 移动到 mid + 1(因为nums[n] < nums[n + 1] ,右边一定存在一个峰值,mid对应的值一定不是峰值)
  2. 如果中值落在右边,那么right 应该 移动到 mid(因为nums[n] > nums[n + 1] ,左边一定存在一个峰值,mid对应的值有可能是峰值)

有了思路,直接套用模版秒了!!!

class Solution {
public:int findPeakElement(vector<int>& nums) {int left = 0 , right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] < nums[mid + 1]){left = mid + 1;}else{right = mid;}}return left;}
};

提交 过啦!!!

Leetcode 153. 寻找旋转排序数组中的最小值

上链接!!!153. 寻找旋转排序数组中的最小值

题目描述

在这里插入图片描述
根据题目描述啊,是很好理解的,就是将一个有序的数组进行移动,使其旋转,形成一个先增长然后断崖后再增长的数组,我们要找到其中的最小值

算法思路

这个题的暴力算法很简单(我们不考虑),首先也是来分析二段性。这个二段性如何进行分析呢???

  • 以其中 数组末位值为分割,由于旋转的特性,左边一部分是大于末位值 右边一部分是小于等于末位值

然后根据二段性进行算法分析:

  1. 如果中值落在左边,那么left 应该 移动到 mid + 1(左边一定不存在最小值,mid 对应的值一定不是最小值)
  2. 如果中值落在右边,那么right 应该 移动到 mid(右边一定不存在一个峰值,mid对应的值有可能是最小值)

根据算法逻辑,直接秒杀:

class Solution {
public:int findMin(vector<int>& nums) {//分析二段性质//左边都大于 末位数字 右边都 小于等于 末尾数字int left = 0;int right = nums.size() - 1;while(left < right){int mid = left +(right - left) / 2;//说明mid 在最小值 左边 if(nums[mid] > nums[nums.size() - 1]){left = mid + 1;}else{right = mid;}}return nums[left];}
};

提交:过啦!!!

Leetcode LCR 173. 点名

最后一道:LCR 173. 点名!!!

题目描述

在这里插入图片描述
题目非常简单奥,就是寻找断点。(有坑哦)

算法思路

暴力算法有很多种:遍历,位运算,数学公式。我们来用更快速的二分查找算法
首先来分析二段性,这个其实不太好想

  • 以其中断点为分割,左边一部分是数组值与下标相等 ,右边一部分是数组值与下标不相等

根据这个二段性我们就可以来进行算法分析:

  1. 如果中值落在左边,那么left 应该 移动到 mid + 1(左边一定不存在断点,mid 对应的值一定不是断点)
  2. 如果中值落在右边,那么right 应该 移动到 mid(mid对应的值有可能是断点)
  3. 注意如果最后left到了最右边,那么缺少的是最后一名同学,要进行一个判断

根据这个算法逻辑,我们书写代码:

class Solution {
public:int takeAttendance(vector<int>& nums) {//寻找二段性//左边下标对应 右边下标不对应int left = 0 ; int right = nums.size() - 1;while(left < right){int mid = left + (right - left ) / 2;//if(nums[mid] == mid){left = mid + 1;}else{right = mid;}}//left到了最右边,缺少的是最后一名同学,要进行一个判断return nums[left] == left ? nums.size() : left ;}
};

提交过啦!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见

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

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

相关文章

【EtherCAT】FMMU和SM简介

目录 一、简介 1、 FMMU 2、SM (1) 缓冲模式 (2)邮箱模式 3、FMMU将物理存储器映射到逻辑过程数据映射的配置原理 二、FMMU和SM在EtherCAT从站控制器的存储空间分配 三、FMMU和SM部分寄存器描述(LAN9253) 1、FMMU 2、SM 四、FMMU和SM的数据结构&#xff08;soem主站&…

什么是AIoT?

什么是AIoT? AIoT&#xff0c;即人工智能物联网&#xff0c;是一种将人工智能&#xff08;AI&#xff09;技术与物联网&#xff08;IoT&#xff09;相结合的新型应用形态。它不仅实现了设备之间的互联互通&#xff0c;还赋予了它们更智能化的特性。AIoT的核心在于通过AI的数据…

什么是知乎知+广告推广?

知乎作为中国领先的知识分享社区和高质量用户群体汇聚地&#xff0c;其广告价值日益凸显&#xff0c;其中&#xff0c;“知”作为知乎官方推出的创新广告形式&#xff0c;正逐渐成为品牌与消费者深度连接的重要桥梁。知广告推广不仅局限于传统意义上的硬性推广&#xff0c;更强…

解锁棋盘之谜:探索N皇后问题的全方位解决策略【python 力扣51题】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

前后端跨域请求代码实战(vue3.4+springboot2.7.18)

前端代码 v3.4.21&#xff08;前端不是主业&#xff0c;所以就贴一贴代码&#xff0c;有疑问评论区见&#xff09;后端代码&#xff0c;springboot 2.7.18&#xff08;后端&#xff09; 文章内容&#xff1a; 一&#xff0c;后端代码 二&#xff0c;前端代码 三&#xff0c;后…

【ARM 裸机】I.MX 启动方式之启动头文件 1

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动设备的选择&#xff1b; 2、启动头文件 当 BOOT_MODE1 为 1&#xff0c;BOOT_MODE0 为 0 的时候此内部 BOOT 模式&#xff0c;在此模式下&#xff0c;芯片会执 行内部的 BOOT ROM 代码&#xff0c;这段 BOOT ROM 代码会进…

tensor是pytorch的核心,那torch.tensor和torch.Tensor区别是?

本文重点 从本节课程开始我们将正式开启pytorch的学习了&#xff0c;在深度学习框架中有一个重要的概念叫做张量&#xff0c;它是pytorch的基本操作单位&#xff0c;要想创建tensor有很多的方式&#xff0c;但是有两个torch.tensor和torch.Tensor容易混淆&#xff0c;本节课程…

javase__进阶 day13stream流和方法引用

1.不可变集合 1.1 什么是不可变集合 ​ 是一个长度不可变&#xff0c;内容也无法修改的集合 1.2 使用场景 ​ 如果某个数据不能被修改&#xff0c;把它防御性地拷贝到不可变集合中是个很好的实践。 ​ 当集合对象被不可信的库调用时&#xff0c;不可变形式是安全的。 简单…

大厂面试精华面试刷题

1.自定义unshift实现相同效果 2.数组去重 用vs2019来写这种练习题可以更直观的查看代码执行的效果&#xff0c;最后的代码是控制控制台执行完毕后不自动关闭 use strict;let arr [1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10] //1.//查重最简单的方法for循环结合splice从数组中…

【C++】飞机大战项目记录

源代码与图片参考自《你好编程》的飞机大战项目&#xff0c;这里不进行展示。 本项目是仅供学习使用的项目 飞机大战项目记录 飞机大战设计报告1 项目框架分析1.1 敌机设计&#xff1a;1.2 玩家飞机控制&#xff1a;1.3 子弹发射&#xff1a;1.4 游戏界面与互动&#xff1a;1.5…

解决Linux根分区空间不足的方法:利用Home分区进行扩容

前言 在进行系统安装时&#xff0c;一个常见的困扰是默认分区设置可能导致home分区拥有过多的空间&#xff0c;而root分区却显得十分紧缺。这种情况下&#xff0c;用户往往会陷入无法继续安装软件或存储文件的困境。本文将向您展示如何通过合理的调整&#xff0c;将home分区中多…

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论&#xff1a;一般用inner join来改写in和exist&#xff0c;用left join来改写not in&#xff0c;not exist&#xff1b;&#xff08;本文会比较内连接&#xff0c;包含in子句的子查询&#xff0c;exist的性能 &#xff09; 1. 本文总结自高性能mysql 6…

Python 面向对象——1.基本概念

本章学习链接如下&#xff1a; 基本概念与语法 类&#xff08;Class&#xff09;&#xff1a;定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。 对象&#xff08;Object&#xff09;&#xff1a;类的实例。对象包含实际的数据和操作数据的方法。 属性&#xff0…

NLP_知识图谱_三元组实战

文章目录 三元组含义如何构建知识图谱模型的整体结构基于transformers框架的三元组抽取baselinehow to use预训练模型下载地址训练数据下载地址 结构图代码及数据bertconfig.jsonvocab.txt datadev.jsonschemas.jsontrain.jsonvocab.json 与bert跟data同个目录model.pytrain.py…

原型和原型链--图解

https://juejin.cn/post/7255605810453217335 prototype是函数的属性&#xff08;一个对象&#xff09;&#xff0c;不是对象的属性&#xff0c;普通函数和构造函数的prototype属性是空对象&#xff5b;&#xff5d;&#xff08;其实有2个属性&#xff0c;一个是constructor&a…

Vue3: toRefs与toRef的基本使用

一、前言 本文主要介绍toRefs与toRef的基本使用。 二、内容 1、基本概念 作用: toRefs与toRef可以将一个响应式对象中的每一 个属性&#xff0c;转换为ref对象&#xff1b;不同 toRefs与toRef功能一致&#xff0c;但toRefs可以批量转换。 2、toRefs 如果把reactive定义的…

记录交叉编译环境配置--海思开发板的 嵌入式nginx和 php的移植

嵌入式 lnmp搭建的记录 一些交叉编译的配置环境思路分享&#xff1a;P&#xff1a;php编译PHP可能遇到的问题configure阶段&#xff1a;Makefile-make阶段&#xff1a;Makefile-make install阶段&#xff1a; N&#xff1a;Nginx 文章比较水&#xff0c;并没有没解决什么实际问…

二维码门楼牌管理应用平台建设:助力场所整改与消防安全

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、二维码门楼牌管理应用平台在场所整改中的作用三、二维码门楼牌管理应用平台的意义与价值四、二维码门楼牌管理应用平台的未来展望 前言 随着城市管理的日益精细化&#xff0c;二维码门楼牌管理应用平台的建设成为了提…

C++ - STL详解(七)— stack和queue的介绍及使用

目录 一. stack 1.1 stack的介绍 1.2 stack的定义 1.3 stack的使用 ​编辑 二. queue 2.1 queue的介绍 2.2 queue的定义 2.3 queue的使用 一. stack 1.1 stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除…

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时&#xff0c;日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态&#xff0c;定位问题&#xff0c;以及优化性能。下面&a…