当前位置: 首页 > news >正文

算法修炼之路之二分查找

目录

一:三大二分介绍及模板

1.普通二分

2.查找左右边界的二分及模板 

二:LeetCode OJ练习

1.第一题

2.第二题 

 3.第三题

 4.第四题

 5.第五题

 6.第六题

一:三大二分介绍及模板

1.普通二分

这里通过一道题来引出普通二分及模板

LeetCode_704 二分查找

画图分析:

 

具体代码:

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) right=mid-1;else if(nums[mid]<target) left=mid+1;else return mid;}return -1;}

普通二分模板

 

2.查找左右边界的二分及模板 

 通过题来引出

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

画图分析:

 

具体代码:

vector<int> searchRange(vector<int>& nums, int target) {//处理边界情况if(nums.size()==0) return {-1,-1};int left=0,right=nums.size()-1;int begin=0;//查找左端点while(left<right){int mid=left+(right-left)/2;if(nums[mid]<target) left=mid+1;else right=mid;}//判断是否有结果if(nums[left]==target) begin=left;//标记一下左端点else return {-1,-1};//查找右端点left=0,right=nums.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(nums[mid]>target) right=mid-1;else left=mid;}return {begin,left};}

左右边界的二分模板: 

二:LeetCode OJ练习

1.第一题

LeetCode_69 x的平方根

画图分析:

 

具体代码:

int mySqrt(int x) {//处理边界情况if(x<1) return 0;int left=1,right=x;//防止当x=INT_MAX时,right-0+1操作直接越界的while(left<right){long long mid=left+(right-left+1)/2;//防止越界if(mid*mid>x) right=mid-1;else left=mid;}return left;}

2.第二题 

 LeetCode_35 搜索插入位置

画图分析:

 

具体代码:

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

 3.第三题

LeetCode_852 山脉数组的峰顶索引

画图分析:

 

具体代码:

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

 4.第四题

LeetCode_162 寻找峰值

 画图分析:

具体代码:

 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]) right=mid;else left=mid+1;}return left;}

 5.第五题

LeetCode_153 寻找旋转排序数组中的最小值

画图分析:

 

具体代码:

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

 6.第六题

LeetCode_LCR 173 点名

画图分析:

 

具体代码:

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;}//处理细节问题return records[left]==left? left+1:left;}
http://www.lryc.cn/news/454587.html

相关文章:

  • OpenAI预计明年将推出“代理”系统
  • 每日OJ题_牛客_重排字符串_贪心_C++_Java
  • Python 进阶部分详细整理
  • [ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题
  • 【黑马点评】 使用RabbitMQ实现消息队列——2.使用RabbitMQ监听秒杀下单
  • 业务封装与映射 -- OTUk/ODUk/OPUk开销帧结构
  • Vim基本用法
  • python 实现Tarjan 用于在有向图中查找强连通分量的算法
  • Qt开发技巧(十五)字符串去除空格,跨网段搜索不生效,设置图片显示失败问题,表格视图的批量删除,主动判断字串编码,开启向前查询的属性,画家类载入html来绘制
  • 【机器学习】智驭未来:探索机器学习在食品生产中的革新之路
  • Ubuntu 安装CUDA并使用Docker配置Pytorch环境
  • 【论文阅读】Simulating 500 million years of evolution with a language model
  • detectron2/layers源码笔记
  • LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱
  • React基础-快速梳理
  • H.264编解码 - NALU详解
  • vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI
  • 图解C#高级教程(四):协变、逆变
  • 详解CSS中的伪元素
  • paper_template
  • 【Bug】解决 Ubuntu 中 “error: Unable to Find Python3 Executable” 错误
  • CUDA与TensorRT学习六:模型部署-CNN、模型部署-YOLOv8检测器、部署BEVFusion模型
  • 防sql注入的网站登录系统设计与实现
  • 如何快速切换电脑的ip地址
  • 鸿蒙HarmonyOS之选择相册文件(照片/视频)方法
  • 【QT Qucik】C++交互:接收QML信号
  • 【C++】关键字+命名空间
  • 网络层——IP
  • 随笔 漫游互联网
  • 8.9K Star,开源自托管离线翻译引擎