【LeetCode】升级打怪之路 Day 01:二分法

news2024/11/18 6:43:10

今日题目:

  • 704. 二分查找
  • 35. 搜索插入位置
  • 34. 在排序数组中查找元素的第一个和最后一个位置

目录

    • 今日总结
    • Problem 1: 二分法
      • LeetCode 704. 二分查找 【easy】
      • LeetCode 35. 搜索插入位置 ⭐⭐⭐⭐⭐
      • LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 【medium】

今日总结

重点学习了使用二分法来解决问题,需要特别理解的是,二分法在通过 while(low <= high) 循环后,low 与 high 的关系所呈现出来的性质,以及为什么能够呈现这样的性质。利用这个性质可以更容易地解决相关问题。

Problem 1: 二分法

LeetCode 704. 二分查找 【easy】

704. 二分查找 | LeetCode

这个题目很经典,题目本身很简单,但这里有一种具有普适性的写法,可以用来解决其他二分查找相关的题目,这里需要着重学习一下
在这里插入图片描述
关键理解好二分法在经过 while(low <= high) 这个循环后,low 和 high 所呈现出来的结果的性质

在这里插入图片描述

  1. high 最后一定是在 low 左边,而且 high == low - 1,形成一个交错
  2. low 和 high 中间将数字序列划分成了两个部分:
    • 左半边从开始到 high 为止,都是小于 target
    • 右半边从 low 到结束,都是大于等于 target

为什么会具备这样的性质
简单来说,因为 while 的判断是 low <= high,所以最终 low 一定是大于 high。
同时,low 和 high 每次更新都是基于 mid 来向前或向后一步走,而 mid 是一定出现在 [low,high] 这个区间内,所以每次更新的结果是,low 或 high 一定是处于原先 [low,high] 范围内或者这个范围的左边或右边一个为止。所以,最终一定是 high == low - 1
当然,目前也很容易理解 [0, high] 一定是小于 target,[low, end) 一定是大于等于 target。因为当 nums[mid] == target 时,我们是将 high 移动到 mid 左边,这样的结果就是让等于 target 元素的值出现在了 high 右边,所有右半边才会有等于 target 的元素。

在上面的代码中,low 最终指向的是第一个大于等于 target 的元素,但由于 target 可能不存在,所以在作为结果返回时,需要判断一下 low 是否在 nums 的合法范围内,以及 low 指向的值是否等于 target。

学会了这个题目,下面几个题目就是可以利用这里总结的性质来解决。

LeetCode 35. 搜索插入位置 ⭐⭐⭐⭐⭐

35. 搜索插入位置 | LeetCode

通过这个题,对二分法的思路有了更深入的理解。

这个题目是返回搜索的位置或者插入的位置,自然也就是 low 的位置,所以代码如下:
在这里插入图片描述
整体与第一个二分法的题目一样,只是最后直接把 low 给 return 出去而已。

所以,学习二分法需要注意

  • 代码中 while 的条件、low 与 high 变更的方式
  • 经过 while 循环后 low 与 high 所呈现出来的性质

LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 【medium】

34. 在排序数组中查找元素的第一个和最后一个位置 | LeetCode

这个题目就有难度了,解决这个题目,需要依靠我们在上面的题目中总结出来的经验。

由于题目要求复杂度 O ( log ⁡ n ) O(\log n) O(logn),所以需要通过两次二分查找来分别找到左边界和右边界。

刚刚我们总结到,当经过 while 循环后,low 指向了第一个大于等于 target 的元素,这不就是这个题目的左边界嘛!所以,我们可以写出找左边界的代码,但是因为这个题目中 nums 中的数字是可能重复的,所以我们需要做一些更改:

在这里插入图片描述
这个代码有两点需要我们特别关注:

  • val == target 的时候,我们是更新 low 还是 high?
  • 左边界和 low 的关系?

在上面代码中,如果 val == target,那么就让 high 移动到 mid 左边,这样的结果就是当 while 循环完之后,等于 target 的元素都出现在了右半边,也就是 [low, end) 这个区间内,所以 low 才成了左边界。

同时因为 low 可能超出 nums 的索引范围,以及可能没有找到 target,所以给左边界 first 赋值时需要检查一下,检查不通过就是赋值 -1,代表没有找到。

根据刚刚的思路,当 val == target 时,如果我们让 low 移动到 mid 右边,那么 while 循环完的结果就变成了 “target 的元素都出现了左半边”,也就是 [0, high] 这个区间,所以 high 自然就成了右边界。

所以寻找右边界的二分写法是:

在这里插入图片描述
注意这里与找左边界的区别。

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

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

相关文章

类和对象 01【C++】

目录 一、 类的引入1. 类的定义2. 类的访问限定符及封装(1) 访问限定符(2) 封装 3. 类的实例化4. 类对象模型(1) 计算类对象的大小(2) 类对象的存储方式 5. this指针 二、 类的6个默认成员函数1. 构造函数2. 析构函数3. 拷贝构造函数4. 赋值运算符重载5. 取地址重载6. const取地…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 官网教程&#xff1a;gem5: Classic caches 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用…

常用驱动适配总结

I2C驱动 I2C中主要包含5个管脚&#xff0c;包括&#xff1a;复位信号&#xff0c;中断信号&#xff0c;I2C时钟信号&#xff0c;I2C数据信号&#xff0c;触摸屏供电信号&#xff08;我的电路供电没有控制信号&#xff09;。设备树相对简单了很多。 SCL和SDA管脚是需要在i2c的…

WebRTC最新版报错解决:city.wav:missing and no known rule to make it (二十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

Chrome关闭时出现弹窗runtime error c++R6052,且无法关闭

环境&#xff1a; Chrome 版本121 Win10专业版 问题描述&#xff1a; Chrome关闭时出现弹窗runtime error cR6052&#xff0c;且无法关闭 解决方案&#xff1a; 1.任务管理器打开&#xff0c;强制结束进程 2.再次打开谷歌浏览器&#xff0c;打开设置关于Chrome&#xff0…

Chrome插件精选 — 缓存清理

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. Chrome清理大师…

MySQL|MySQL基础(求知讲堂-学习笔记【详】)

MySQL基础 目录 MySQL基础一、 MySQL的结构二、 管理数据库1&#xff09;查询所有的数据库2&#xff09;创建数据库3&#xff09;修改数据库的字符编码4&#xff09;删除数据库5&#xff09;切换操作的数据库 三、表的概念四、字段的数据类型4.1 整型4.2 浮点型(float和double)…

机试笔记-害死人不偿命的(3n+1)猜想

来自 “胡凡《算法笔记》” 比较容易理解的题目 应该要想到用while&#xff08;&#xff09;循环&#xff0c;因为题设中给出了当 n 1的时候脱离计算的要求&#xff0c;所以以后计算的过程中应该想到用while&#xff08;&#xff09;的循环作为测试条件

【linux】【Shell】Linux基础命令集

目录 一、常用操作命令 二、编辑命令 三、挂载磁盘命令 一、常用操作命令 1、cd :更改文件目录命令 1.切换到主目录cd2.切换到目录/tmpcd /tmp3.切换到当前目录 dir目录cd dir4.切换到根目录cd /5.切换到上一级目录cd ..6.切换到二级目录cd ../..7.切换到主目录&#xff0…

打造纯Lua组件化开发模式:Unity xLua框架详解

在传统的Unity开发中&#xff0c;通常会使用C#来编写游戏逻辑和组件。但是&#xff0c;随着Lua在游戏开发中的应用越来越广泛&#xff0c;我们可以将游戏逻辑和组件完全用Lua来实现&#xff0c;实现纯Lua的组件化开发模式。这样做的好处是可以更加灵活地修改游戏逻辑&#xff0…

【算法与数据结构】1020、130、LeetCode飞地的数量 被围绕的区域

文章目录 一、1020、飞地的数量二、130、被围绕的区域三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、1020、飞地的数量 思路分析&#xff1a;博主认为题目很抽象&#xff0c;非常难理解。想了好久&#xff0c;要理解…

行测:国考省考行测:图形推理,四面体,正六面体的图形推理方法,箭头唯一法

国考省考行测&#xff1a;图形推理 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和行测的重要知识点 遇到…

(十二)【Jmeter】线程(Threads(Users))之tearDown 线程组

简述 操作路径如下: 作用:在正式测试结束后执行清理操作,如关闭连接、释放资源等。配置:设置清理操作的采样器、执行顺序等参数。使用场景:确保在测试结束后应用程序恢复到正常状态,避免资源泄漏或对其他测试的影响。优点:提供清理操作,确保测试环境的整洁和可重复性…

水经注下载注记地图, mars3d加载底图

使用 水经微图 &#xff08;公司提供的&#xff0c;需付费&#xff0c;我也没有这个东西&#xff09;下载注记地图&#xff1b; 1、选择下载 选择区域&#xff1a; 根据需求进行选择&#xff0c;两边都可以选择&#xff0c;看个人喜欢&#xff1b;这里以澳门为演示 选择地图…

从零开始手写mmo游戏从框架到爆炸(二十一)— 战斗系统二

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 上一章&#xff08;从零开始手写mmo游戏从框架到爆炸&#xff08;二十&#xff09;— 战斗系统一-CSDN博客&#xff09;我们只是完成了基本的战斗&#xff0c;速度属性并没有…

学习数仓工具 dbt

DBT 是一个有趣的工具&#xff0c;它通过一种结构化的方式定义了数仓中各种表、视图的构建和填充方式。 dbt 面相的对象是数据开发团队&#xff0c;提供了如下几个最有价值的能力&#xff1a; 支持多种数据库通过 select 来定义数据&#xff0c;无需编写 DML构建数据时&#…

Facebook的未来蓝图:数字社交的下一个篇章

在数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多的社交媒体平台中&#xff0c;Facebook一直处于领先地位&#xff0c;不断探索着数字社交的新领域和新形式。随着科技的不断发展和社会的不断变革&#xff0c;Facebook正在谱写着数字社交的未…

Vue路由缓存问题

路由缓存问题的产生 VueRouter允许用户在页面中创建多个视图&#xff08;多级路由&#xff09;&#xff0c;并根据路由参数来动态的切换视图。使用带参数的路由时&#xff0c;相同的组件实例将被重复使用。因为两个路由都渲染同一个组件&#xff0c;比起销毁再创建&#xff0c;…

谷歌掀桌子!开源Gemma:可商用,性能超过Llama 2!

2月22日&#xff0c;谷歌在官网宣布&#xff0c;开源大语言模型Gemma。 Gemma与谷歌最新发布的Gemini 使用了同一架构&#xff0c;有20亿、70亿两种参数&#xff0c;每种参数都有预训练和指令调优两个版本。 根据谷歌公布的测试显示&#xff0c;在MMLU、BBH、GSM8K等主流测试…

数据结构·顺序表

1数据结构简介 学习数据结构与算法之前&#xff0c;一般是先学数据结构&#xff0c;方便之后学习算法&#xff0c;那么数据结构拆开介绍&#xff0c;就是数据 和 结构&#xff0c;数据&#xff0c;生活中到处都是&#xff0c;结构&#xff0c;就是数据存储的方式&#xff0c;即…