刷题训练之二分查找

> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练掌握二分查找算法

> 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。

> 专栏选自:刷题训练营

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言分析

        最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:​​​​​​

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

而今天我们的板块是二分查找。

⭐知识讲解

很多小伙伴们在想二分查找嘛,只有升序或者是降序的数字里面查找,有这个想法的是大错特错的,在一些题目中有些无序也可以使用二分查找,所以说二分查找的知识点没有我们想的那么简单,在二分查找中我们会总结一些模板,这些模板要死记硬背要理解哦,题目选取的很多,大家不要跳过一些题目,有些题目是为后面的题目做铺垫的,望大家可以从头看到尾,这里就简单的总结一些二分查找的知识点:

  • 二分查找的时间复杂度:log(N)
  • 二分查找的范围:有序的数组或者无序

⭐经典题型

 🌙topic-->1

题目链接:1. 二分查找 - 力扣(LeetCode)

 

题目分析:

 在一个有序的数组中查找一个数字  target  ,如果存在就返回数组的下标,没有的话就返回-1

算法原理:

  • 解法一:

暴力遍历数组,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

图解:

细节:

  1. 防止 mid 超过整形最大值
  2. 循环的条件是 left <= right

代码演示:

class Solution {
public:int search(vector<int>& nums, int target) {// 定义左右指针int left = 0,right = nums.size() - 1;// 循环while(left <= right) // 细节二{int mid = left + (right - left) / 2;// 细节一if(nums[mid] < target)left = mid + 1;else if(nums[mid] > target)right = mid - 1;elsereturn mid;}// 没有返回-1return -1;}
};

 模板总结:

// 定义左右指针int left = 0,right = nums.size() - 1;// 循环while(left <= right) // 细节二{// int mid = left + (right - left + 1) / 2 等价int mid = left + (right - left) / 2;// 细节一if(....)left = mid + 1;else if(....)right = mid - 1;elsereturn ...;}

🌙topic-->2

题目链接:2.二分查找力扣(LeetCode)

题目分析:

在一个非递归中找一个等于 target 下标,如果没有就返回 {-1,-1}

算法原理:

  • 解法一:

暴力遍历数组,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

class Solution
{
public:vector<int> searchRange(vector<int>& nums, int target){// 定义左右指针int left = 0,right = nums.size() - 1;// 处理空数组if(nums.size() == 0)return {-1,-1};int begin = 0;// 定义左边界// 去除左边界的元素while(left < right) // 细节一{int mid = left + (right - left) / 2;if(nums[mid] < target)left = mid + 1;// 细节二elseright = mid; }// 判断是否有值if(nums[left] != target)return {-1,-1};else begin = left;//标记左边界// 去除右边界left = 0,right = nums.size() - 1;while(left < right){int mid = left + (right - left + 1) / 2; // 细节if(nums[mid] <= target)left = mid;// 细节三elseright = mid - 1;// 细节四 }// 返回return {begin,right};}};

 模板总结:

while(left < right)
{int mid = left + (right - left) / 2;if(...) left = mid + 1;else right = mid;
}while(left < right)
{int mid = left + (right - left + 1) / 2;if(...) left = mid;else right = mid - 1;
}// 下面出现 -1 的时候,上面就加 +1

🌙topic-->3

这道题目就不再讲解的这么细了,具体还得琢磨第二道题目:

题目链接:3.二分查找  - 力扣(LeetCode)

题目分析:

给定一个排序数组(升序)和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

算法原理:

  • 解法一:

暴力遍历数组,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

class Solution {
public:int searchInsert(vector<int>& nums, int target) {// 定两个指针int left = 0,right = nums.size() - 1;// 循环while(left < right){int mid = left + (right - left) / 2;if(nums[mid] < target) left = mid + 1;else right = mid;}// 判断if(nums[left] < target)return right + 1;return right;}
};

 🌙topic-->4

这道题目就不再讲解的这么细了,具体还得琢磨第二道题目:

题目链接:4.二分查找  - 力扣(LeetCode)

 

题目分析:

求 X 的算数平方根,结果保留整数。

算法原理:

  • 解法一:

暴力举例1 2 3 .... x,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

class Solution {
public:int mySqrt(int x) {// 处理if(x < 1) return 0;// 定义两个指针int left = 1,right = x;// 循环while(left <right){// 防止溢出long long mid = left + (right - left +1) /2;if(mid * mid <= x) left = mid;else right = mid -1;}return left;}
};

  🌙topic-->5

这道题目就不再讲解的这么细了,具体还得琢磨第二道题目:

题目链接:5.二分查找  - 力扣(LeetCode)

  

题目分析:

有一个山峰数组(数组有递增和递减),返回数组中峰顶的下标。

算法原理:

  • 解法一:

暴力遍历数组就可以了,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {// 定义两个指针int left = 1,right = arr.size() - 2;// 循环while(left < right){int mid = left + (right - left + 1) / 2;if(arr[mid] > arr[mid - 1]) left = mid;else right = mid - 1;}return left;}
};

   🌙topic-->6

这道题目就不再讲解的这么细了,这里和第五道题目几乎一样:

题目链接:6.二分查找  - 力扣(LeetCode)

  

题目分析:

有一个山峰数组,这个山峰数组有多个山峰,只要返回其中一峰顶就行(返回数组中峰顶的下标)

算法原理:

  • 解法一:

暴力遍历数组就可以了,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

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;}
};

   🌙topic-->7

这道题目就不再讲解的这么细了,具体还得琢磨第二道题目:

题目链接:7. 二分查找- 力扣(LeetCode)

  

题目分析:

在一个数组中找最小值。

算法原理:

  • 解法一:

暴力遍历数组就可以了,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

class Solution
{
public:int findMin(vector<int>& nums){int left = 0, right = nums.size() - 1;int x = nums[right]; // 标记⼀下最后⼀个位置的值while (left < right){int mid = left + (right - left) / 2;if (nums[mid] > x) left = mid + 1;else right = mid;}return nums[left];}
};

 🌙topic-->8

这道题目就不再讲解的这么细了,具体还得琢磨第二道题目:

题目链接:8.二分查找  - 力扣(LeetCode)

  

题目分析:

在一个  0 ~  n-1  数组中找缺少的数字。

算法原理:

  • 解法一:

暴力遍历数组就可以了,时间复杂度为O(n)。

  • 解法二:

采用二分查找,二分算法原理博客,这里如果不会二分查找的小伙伴们大家可以看看这篇博客,这里我们再讲解一下解法二的算法原理。

代码演示:

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

 🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

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

相关文章

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

(十五)C++自制植物大战僵尸游戏僵尸基类讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 在游戏中,最重要的两个类别就是植物与僵尸。僵尸可以对植物进行攻击,不同的僵尸攻击方式可能会不同,但是不同又有许多相同的属性。在基类(父类)中定义僵尸共有属性,供派生类(子类)继承。 僵尸状态转换 僵尸…

Nacos分布式配置中心

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…

Android永不息屏和关闭锁屏

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

kali——勒索病毒metasploit

我先来叙述一下大致流程&#xff1a; 1、使用mfs对 445端口进行攻击获得一系列权限 2、更新mfs版本 3、使用search 17_010对命令进行查看 4、use auxiliary/scanner/smb/smb_ms17_010使用该模块设置靶机set rhosts 靶机ip和设置本机监听端口 set lhost 0-65535 5、options…

数智亚运,为什么需要智能电子桌牌?

近日&#xff0c;杭州亚运会博物馆正式对公众开放&#xff0c;深度还原了杭州从申请办、筹办至举办亚运会的各个精彩历程。馆内有“亚运与杭州”、“亚运与亚洲”“亚运与未来”三大板块展示区&#xff0c;展示了大量亚运会使用过的实物&#xff0c;还有当时引人注目的数字科技…

53、图论-课程表

思路&#xff1a; 其实就是图的拓扑排序&#xff0c;我们可以构建一个图形结构&#xff0c;比如[0,1]表示1->0&#xff0c;对于0来说入度为1。 遍历结束后&#xff0c;从入度为0的开始遍历。引文只有入度为0的节点没有先决条件。然后依次减少1。直到所有节点入度都为0.然后…

开发同城O2O跑腿系统源码:构建高效便捷的本地服务平台教程

为了满足用户对便捷的需求&#xff0c;今天我们将一同探讨如何开发一个高效便捷的同城O2O跑腿系统&#xff0c;以构建一个功能全面、操作简单的本地服务平台。 一、确定需求和功能 在开发同城O2O跑腿系统之前&#xff0c;首先需要明确系统的需求和功能。用户可以通过该系统发布…

flutter笔记-hello dart

文章目录 1. 搭建环境2. 运行官方首个程序3. AS中运行iOSAndroid 语法简述1. 变量常量字符串补充 2. 集合3. 函数关于可选报错&#xff1a;匿名函数 4. 特殊运算符5. 类 dart 包 1. 搭建环境 环境的搭建在window和mac都差不多&#xff0c;都是从官网下载对应操作系统对应版本的…

某零售企业招聘管理体系搭建咨询项目

科学岗位分析&#xff0c;改善招聘流程&#xff0c;提高招聘及时率随着公司不断发展壮大&#xff0c;企业规模逐渐增大&#xff0c;部门设置也日益增多&#xff0c;因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…

开源博客项目Blog .NET Core源码学习(17:App.Hosting项目结构分析-5)

本文学习并分析App.Hosting项目中前台页面的作品展示页面和首页页面。 作品展示页面 作品展示页面总体上为上下布局&#xff0c;上方显示导航菜单&#xff0c;下方从左向右显示图片数据&#xff0c;支持放大查看图片和下载图片。整个页面使用了layui中的面包屑导航、弹出层、流…

强化学习2:Q-learning 算法

如果对强化学习没有了解&#xff0c;推荐先学习一下&#xff1a;强化学习基本原理 1 Q-Learning&#xff1a;简介 Q-Learning 是一种基于价值迭代的强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;中的问题。在 Q-Learning 中&#xff0c;代理…

SAP DMS创建文档根目录操作简介

前面我们已经对DMS的后台进行了系统的配置,本文开始我们对DMS的前台操作进行说明 1、CV01N创建文档 注意:EDIPUBLICROOTFOLDER为根目录的凭证号,不允许更改。 输入好后回车。进入下图所示: 点击文档浏览器,进入下一屏如下图: 注意:点击创建新的私人文件夹按创建是创…

关于pdf.js中文本坐标尺寸的使用

一个电子教材项目中有这样一个需求&#xff1a; 用户向网站上传一个PDF书籍后&#xff0c;网站可以对PDF书籍进行解析&#xff0c;并支持用户对PDF书籍的每一页做一些操作&#xff0c;比如&#xff1a;为英语课本的单词和句子添加音频热区。因为热区数量很多&#xff0c;所以&a…

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

PHP校验15位和18位身份证号

第十八位数字的计算方法为&#xff1a; 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分 别为&#xff1a;7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11&#xff0c;看余数是多少&#xff1f; 4…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

自定义数据 微调CLIP (结合paper)

CLIP 是 Contrastive Language-Image Pre-training 的缩写&#xff0c;是一个擅长理解文本和图像之间关系的模型&#xff0c;下面是一个简单的介绍&#xff1a; 优点&#xff1a; CLIP 在零样本学习方面特别强大&#xff0c;它可以&#xff08;用自然语言&#xff09;给出图像…

【深度学习】行人跌倒行为检测软件系统

行人跌倒检测系统在各个领域的应用都对社会的整体健康、安全和福祉产生积极影响&#xff0c;为人们的生活和工作提供了更加安全和可靠的环境&#xff0c; 本文主要使用YOLOV8深度学习框架自训练了一个“行人跌倒检测模型”&#xff0c;基于此模型使用PYQT5实现了一款界面软件用…

Visual Studio2022中使用水晶报表

1.创建水晶报表项目 选择需要的表 自动生成连接 选项:可跳过 后续还有一些 都能跳过 看你自己的需求 自己选的样式