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

news2024/11/16 19:42:29

                                             创作不易,感谢三连!! 

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

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

二、二分查找(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.coloradmin.cn/o/1515615.html

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

相关文章

哪个牌子的大路灯对学生的视力好?一文带你了解大路灯

大路灯在如今市场中销量越来越高&#xff0c;与传统台灯相比&#xff0c;大路灯采用LED灯和专业的护眼技术&#xff0c;可以有效缓解用眼疲劳、帮助放松和舒适照明。但需要注意的是&#xff0c;目前市场中品牌类型较多&#xff0c;也有很多劣质的产品&#xff0c;比如网红或跨界…

吴恩达CNN之卷积初学习---二维卷积

1、卷积的实现 从左到右的矩阵可以看作&#xff1a;一幅图像、过滤器filter&#xff08;核&#xff09;、另一幅图像 编程中卷积的实现&#xff1a;支持卷积的深度学习框架都会有一些函数实现这个卷积运算 python&#xff1a;conv_forward函数 TensorFlow&#xff1a;tf.nn.…

ZStack Cloud云平台承载都江堰市人民医院核心业务

三甲医院都江堰市人民医院通过ZStack Cloud云平台对医院信息化架构进行了全面升级改造&#xff1a;一期通过ZStack Cloud云平台分布式存储&#xff0c;承载OA、短信、数字图书馆、餐厅消费系统、体检服务等一般业务&#xff1b;二期通过ZStack Cloud云平台承载医院HIS管理系统、…

18个惊艳的可视化大屏(第23辑):电子政务,一目了然如胸。

数据展示与监控&#xff1a; 可视化大屏可以将政务数据以图表、地图、仪表盘等形式展示出来&#xff0c;直观地呈现政务工作的进展、趋势和关键指标。通过大屏监控&#xff0c;政府部门可以实时了解各项指标的情况&#xff0c;及时发现问题并采取相应措施。 决策支持&#xff…

wifi的5G和3GPP的5G

wifi 5G 跑的是802.11的协议。 wifi的5G指的就是频率&#xff0c;例如wifi2.4G&#xff0c;其频段处于2.400GHz~2.4835GHz之间&#xff0c;wifi5G的频率范围为5.15GHz到5.875GHz&#xff0c;其中包括多个频道。 这里有个误区&#xff0c;并不是运行在5GHz频段的WI-FI就是5G …

鸿蒙:文本滑动选择器弹窗

根据指定的选择范围创建文本选择器&#xff0c;展示在弹窗上。 该组件从API Version 8开始支持 TextPickerDialog.show show(options?: TextPickerDialogOptions) 定义文本滑动选择器弹窗并弹出。 TextPickerDialogOptions参数&#xff1a; 参数名 参数类型 必填 参数…

第四百回 channel

文章目录 1. 知识回顾2. 示例代码3. 经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了…

探索数据可视化:Matplotlib 高级绘图功能(四)

3D图形 线形图&散点图 import numpy as np import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d.axes3d import Axes3Dx np.linspace(0,60,300) y np.sin(x) z np.cos(x)fig plt.figure(figsize(9,6)) a3 Axes3D(fig) # 二维变成3D a3.plot(x,y,z)plt.figure…

SecureCRT出现乱码的解决方法

SecureCRT是一个商业终端连接工具&#xff0c;它支持多种自定义设置。默认设置下&#xff0c;通过SecureCRT连接SSH服务器可能出现中文乱码的情况。这是由于SecureCRT字符编码与服务器的字符编码不一致造成的。 当然解决这个问题也很简单&#xff0c;将SecureCRT字符编码设置成…

原型模式(Clone)——创建型模式

原型模式(clone)——创建型模式 什么是原型模式&#xff1f; 原型模式是一种创建型设计模式&#xff0c; 使你能够复制已有对象&#xff0c; 而又无需依赖它们所属的类。 总结&#xff1a;需要在继承体系下&#xff0c;实现一个clone接口&#xff0c;在这个方法中以本身作为拷…

Cesium--基于材质旋转图片

材质部分的代码如下 // 自定义材质const customMaterial new Cesium.Material({translucent: true,fabric: {uniforms: {image:circle_img,speed:30.0,},source: czm_material czm_getMaterial(czm_materialInput materialInput){czm_material material czm_getDefaultMateri…

spring中事务失效的场景有哪些?

异常捕获处理 在方法中已经将异常捕获处理掉并没有抛出。 事务只有捕捉到了抛出的异常才可以进行处理&#xff0c;如果有异常业务中直接捕获处理掉没有抛出&#xff0c;事务是无法感知到的。 解决&#xff1a;在catch块throw抛出异常。 抛出检查异常 spring默认只会回滚非检…

Unity Timeline学习笔记(1) - 创建TL和添加动画片段

Timeline在刚出的时候学习了一下&#xff0c;但是因为一些原因一直都没用在工作中使用。 版本也迭代了很久不用都不会用了&#xff0c;抽时间回顾和复习一下&#xff0c;做一个笔记后面可以翻出来看。 创建Timeline 首先我们创建一个场景&#xff0c;放入一个Plane地板&#…

SSA-LSTM多输入分类预测 | 樽海鞘优化算法-长短期神经网络 | Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

mysql不能远程连接的解决办法

问题: 安装完mysql之后,在本机可以正常使用,但是通过其它电脑不能远程连接. 解决方案: 在安装mysql的电脑上,登录mysql, 执行权限 GRANT ALL PRIVILEGES ON *.* TO root"%" IDENTIFIED BY "password"; 刷新权限 flush privileges;

照片生成数字人解决方案

美摄科技&#xff0c;凭借其前沿的照片生成数字人解决方案&#xff0c;正成为这一变革的引领者&#xff0c;助力企业打造全新、生动的数字人形象&#xff0c;进一步提升品牌影响力和市场竞争力。 美摄科技的照片生成数字人解决方案&#xff0c;以其高度的真实感和灵活性&#…

微服务链路追踪-SkyWalking

一、为什么需要链路追踪&#xff1f; 由于微服务化项目拆分&#xff0c;会导致系统服务间调用链路愈发复杂&#xff0c;此时&#xff0c;一个前端请求可能最终需要调用多个后端服务才能完成实现。 微服务间调用链路可能是这样&#xff1a; 当整个请求不可用出现问题时&#x…

【Unity】Transform、Rigidbody、CharacterController移动

前言 在使用Unity开发的时候&#xff0c;移动是最最基础的一个需求&#xff0c;我来给大家简单的讲一下Unity中的几种常见的移动方法。 1.Transform移动 Transform移动就是修改物体的position ①修改位置 这里要注意&#xff1a;坐标分为世界坐标和本地坐标 //将物体的世界坐…

完整的通过git命令框和windows窗口将本地文件上传到gitee远程仓库流程步骤

1.下载git 这个网站搜索git官方&#xff0c;去下载就行了 2.打开git安装后的Git Bash命令框 3.在Git Bash命令框设置一下要远程链接的gitee账号 git config --global user.name “名字”Git config --global user.email “邮箱” 4.查看一下账号设置 git config --global -…

【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频

Sambert-Hifigan模型介绍 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块&am…