算法思想总结:二分查找算法

                                             创作不易,感谢三连!! 

一、二分查找算法思路总结

大家先看总结,然后再根据后面的题型去慢慢领悟

二、二分查找(easy)

. - 力扣(LeetCode)二分查找

思路:(模版1)正常的二分查找策略

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;else return mid;}return -1;}
};

三、在排序数组中查找元素的第一个位置和最后一个位置

. - 力扣(LeetCode)在排序数组中查找元素的第一个位置和最后一个位置

 要注意示例3提到的边界情况!!

思路:找第一个,用左区间端点查找(模版2),找最后一个,用右端点区间查找(模版3)

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target){if(nums.size()==0)  return {-1,-1};//处理边界情况,否则会越界int begin=0;//区间左端点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{-1,-1};//找不到else begin=left;//区间右端点right=nums.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(nums[mid]<=target) left=mid;//最后会落在区间的右端点else right=mid-1;}return {begin,right};//此时至少有一个左端点,所以不可能找不到。}
};

四、x的平方根

 . - 力扣(LeetCode)x的平方根

思路:右端区间二分查找法

class Solution {
public:int mySqrt(int x) {if(x<1) return 0;//处理边界情况int left=1,right=x/2;while(left<right){long long mid=left+(right-left+1)/2;if(mid*mid>x) right=mid-1;else  left=mid;}return left;}
};

 五、搜索插入位置

. - 力扣(LeetCode)搜索插入位置

思路1:左端区间查找 

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 left+1;return left;}
};

思路2:右端区间查找(有特殊情况,比如正好是和targe相等且只有一个元素

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+1)/2;if(nums[mid]<target) left=mid;else right=mid-1;}//右端区间要考虑边界情况(特殊情况,只有一个元素且正好等于target)if(nums[left]>=target) return left;return left+1;}
};

 六、山峰数组峰顶的索引

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

本题特别的就是不再是升序,而是去找二段性的规律

思路1:左端区间查找 

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

思路2:右端区间查找 

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

七、寻找峰值

. - 力扣(LeetCode)寻找峰值

 左区间端点法:

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

右区间端点法:

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

 八、点名

. - 力扣(LeetCode)点名

左区间端点法 

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

注意:插入元素的时候要注意是否是在最右边插入!

九、 寻找旋转数组中的最小值

. - 力扣(LeetCode)寻找旋转数组中的最小值

思路:左区间端点查找法

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

十、二分查找规律的再总结

       二分查找的策略基本上都是去找一个数,对应的有三种模版:正常的二分查找、左区间端点查找、右区间端点查找。其中正常的二分查找局限性比较大,必须得是升序且限制条件较多,大多数情况下不符合题意。最常用的就是左区间端点(关键是left会大跳跃,且目标位置在较大值区间的左边)和右区间端点法(关键是right会大跳跃,且目标位置在较小值区间的右边)。

  

     后面有遇到相关oj题博主会继续更新的……感谢支持!!

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

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

相关文章

猫头虎博主的技术解码:金三银四特辑——面试官问你为什么离职,HR都认可的离职原因,你学会了吗?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

深信服技术认证“SCCA-C”划重点:信服云托管云

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08…

Pulsar IO实战

一、引言 今天跟着 官方文档 基于docker玩一把Pulsar IO吧 二、概要 在用户能够轻松的将消息队列跟其他系统(数据库、其他消息系统)一起使用时&#xff0c;消息队列的作用才是最强大的。而Pulsar IO connectors可以让你很轻松的创建、部署以及管理这些跟外部系统的连接&#…

软件测试面试都问了什么?中级软件测试岗面试(4面)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一面&#xff08;…

飞翔的小鸟flybirdC#winform

飞翔的小鸟flybirdC#winform 飞翔的小鸟flybirdC#winform是一款基于C#语言开发的Windows桌面应用程序&#xff0c;它模仿了经典游戏“Flappy Bird”的游戏玩法。玩家需要通过点击屏幕来控制小鸟的飞行高度&#xff0c;闯过一系列障碍物&#xff0c;不断挑战自己的最高得分。 …

深信服技术认证“SCCA-C”划重点:深信服桌面云aDesk

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…

迷你内裤洗衣机排名前十名:2024年十大口碑一流内衣洗衣机推荐

如果你对于内衣物的卫生有特殊的清洗需求&#xff0c;那么一台内衣专用的迷你内裤洗衣机是十分值得买的&#xff0c;由于迷你内裤洗衣机的外观尺寸小、重量轻&#xff0c;所以很容易搬运和携带&#xff0c;适合单身公寓、旅馆、露营等场合&#xff0c;不用像传统的家庭洗衣机那…

Net Core 使用Mongodb操作文件(上传,下载)

Net Core 使用Mongodb操作文件&#xff08;上传&#xff0c;下载&#xff09; 1.Mongodb GridFS 文件操作帮助类。 GridFS 介绍 https://baike.baidu.com/item/GridFS/6342715?fraladdin DLL源码&#xff1a;https://gitee.com/chenjianhua1985/mongodb-client-encapsulati…

2024年谷歌SEO的趋势预测及应对建议(川圣SEO)#蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 虽然说“SEO”已死这个口号已经喊了很多年了&#xff08;最终也没死&#xff09;&#xff0c;但是在2023年很…

最新若依项目快速上手

最新若依项目快速上手 配套视频&#xff1a;若依项目快速上手视频 1. 下载源码 官网&#xff1a;https://ruoyi.vip/ 前端 git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git后端 git clone https://gitee.com/y_project/RuoYi-Vue.git2. 数据库 创建数据库ry-vue…

深度学习:推动可持续发展与社会责任的创新引擎!

随着科技的飞速发展和全球化的推进&#xff0c;可持续发展和社会责任逐渐成为各个领域关注的焦点。深度学习作为人工智能的重要分支&#xff0c;在可持续发展和社会责任方面发挥着越来越重要的作用。本文旨在探讨深度学习在环境保护、资源利用、犯罪预防和残障人士辅助等领域的…

深度学习——基本数据类型创建Tensor(持续更新)

声明&#xff1a;本深度学习笔记基于课时18 索引与切片-1_哔哩哔哩_bilibili学习而来 All is about Tensor 定义&#xff1a;Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars and vectors. In fact tensors a…