准备蓝桥杯的宝贝们,二分法基础篇(下)例题讲解

news2024/11/25 22:58:26

二分法例题

    • 第一题:搜索插入位置
      • 解法一(左闭右闭)
      • 解法二(左闭右开)
      • 解法三(暴力求解)
    • 第二题:在排序数组中查找元素的第一个和最后一个位置
      • 解法一(左闭右闭)
    • 第三题:x 的平方根
      • 解法一(左闭右闭)
    • 第四题:有效的完全平方数
      • 解法一(左闭右闭)
      • 解法三(暴力求解)

如果没看过我的上一篇建议可以看看上一篇的板子,下面几个题将会全部按板子展现哦!
戳这里直达—>二分法基础篇

第一题:搜索插入位置

这个题和二分法唯一的不同就是当它找不到对应的目标值时,不是" return -1 "了,而是需要返回的是它该插入位置的下标

题目直达链接

解法一(左闭右闭)

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;//注意!!
        int mid=0;
        while(left<=right)//注意!!
        {
            mid=(right-left)/2+left;
            //mid=((right-left)>>1)+left;这个更快,之间右移一位二进制相当于➗2
            if(nums[mid]>target)
            {
                right=mid-1;
            }
            else if(nums[mid]<target)
            {
                left=mid+1;
            }
            else
                return mid;
        }
        if(target>nums[mid])
        //为了好理解套板子,这里只要简单的判断一下target在mid左边还是右边就可以了
            return mid+1;
        else
            return mid;
        }

解法二(左闭右开)

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

空间复杂度是很优秀的
在这里插入图片描述

解法三(暴力求解)

由于本题的数组长度很短,所以使用暴力未尝不是一个好办法

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int i=0;
        int num=nums.size();
        if(nums[num-1]<target)
            return num;
        if(nums[0]>target)
            return 0;
        for(i=0;i<num;i++)
        {
            if(nums[i]>=target)
                return i;
        } 
        return 0;
        }
    };

事实证明确实很棒哈哈哈哈,因题而异,倒数后两个就是异
在这里插入图片描述

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

这个就
本题直达链接

解法一(左闭右闭)

这个题!我真的一下都不想多看了!!!感觉自己脑子好笨啊啊啊啊

浅浅的解释一下做题想法:很巧妙我只能说
这个题第一个解法
大家想想其实right其实就是相当于一个指针本来它是用来当作判定循环结束的条件,但是现在你想想如果right在 “ target == nums[mid] ”时,还让“ right=mid-1 ”,这时候如果左侧还有 “ target == nums[mid] ”, right继续左移,最后它就停在 “ target == nums[mid] ”元素的前一个,这就锁定了这个target的最前面(哎说不清了,如果还有伙计想不明白,私聊我,我亲自给观众老爷画图!)
sorry偷个图让大家看看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int Getleft=rightGet(nums,target);
        int Getright=leftGet(nums,target);
        if(Getright-Getleft>=0)
            return{Getleft,Getright};
        else
            return{-1,-1};    
    }
private:
    int rightGet(vector<int>&nums,int target)
        {
            int left=0;
            int right=nums.size()-1;//闭区间[left,right]
            while(left<=right)
            {
                int mid=((right-left)>>1)+left;
                if(nums[mid]<target)
                    left=mid+1;
                else
                    right=mid-1;
            }
            return right+1;
        }
    int leftGet(vector<int>&nums,int target)
        {
            int left=0;
            int right=nums.size()-1;//闭区间[left,right]
            while(left<=right)
            {
                int mid=((right-left)>>1)+left;
                if(nums[mid]<=target)
                    left=mid+1;
                else
                    right=mid-1;
            }
            return left-1;
        }    
};

不怕大家笑话这个题我提交了14次,准确的是提交14次,改了n次,甚至因为这个题我还学了 “vector” (浅学),我发现这个是真的迷啊,是不是容器不能直接赋初值,必须要预分配(求教!)
在这里插入图片描述
剩下的几种做法的我后期补上,一定!

第三题:x 的平方根

可能大家第一次看见这个题会有点,为什么它可以用二分,问得好!
因为大家想想,“X"开平方一定 " <= X”,区间在 [0,X] ,这不就是二分了,有序数组,找目标值

题目直达链接

解法一(左闭右闭)

class Solution {
public:
    int mySqrt(int x) {
        int left=0;
        int right=x;
        long long mid=0;
        while(left<=right)//只有在left>right时才会停止,这时x介于[right*right,left*left]之间,所以取整就取小喽,最后return right。
        {
            mid=((right-left)>>1)+left;
            if(mid*mid>x)
                right=mid-1;
            else if(mid*mid<x)
                left=mid+1;
            else
                return mid;
        }
        return right;
        //有小伙伴可能卡这里了,想为啥return right
        //咱一起设想一种情况当x=8,是mid是介于2与3之间,这时当mid=2时,mid*mid<x,left=2+1
        //这时left=right,mid就自然等于right=3,但是此时mid*mid>8了,这时right进去进行减一,使得right=2
        //其实大家想想,平方根无疑就两种情况一种就是可以直接开平方就return mid了,而另一种就是介于两个数之间,这时都需要进行上述的流程,一模一样的,所以现在只有right是满足条件的左区间,而left是右区间。
    }
};

为啥这个题我只更了一个解法(第二种最近会更),暴力我觉得可能不太好题上说了 " 0 <= x <= 2^31 - 1 " ,看过我之前蓝桥杯的博客里面说过,2 ^31 - 1属于long long类型,这时间和空间可能浪费very much(上面可能有胡扯的成分在,所以我下个题写了暴力解法哈哈哈,两个题几乎一样)

第四题:有效的完全平方数

题目直达链接

这个题同上

解法一(左闭右闭)

class Solution {
public:
    bool isPerfectSquare(int num) {
        int left=0;
        long long right=num;
        long long mid=0;
        while(left<=right)
        {
            mid=((right-left)>>1)+left;
            if(mid*mid>num)
                right=mid-1;
            else if(mid*mid<num)
                left=mid+1;
            else
                return true;//全是上个博客的板子
        }
        return false;
    }
};

解法三(暴力求解)

class Solution {
public:
    bool isPerfectSquare(int num) {
       int ans=0;
        for(int i=0;i<=num;i++){
            if((long long)i*i<=num)
                ans=i;
            else   
                break;    
        }
        if((long long)ans*ans==num)
            return true;
        else
            return false;
    }
};

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

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

相关文章

​Base64编码知识详解 ​

在我们进行前端开发时&#xff0c;针对项目优化&#xff0c;常会提到一条&#xff1a;针对较小图片&#xff0c;合理使用Base64字符串替换内嵌&#xff0c;可以减少页面http请求。 并且还会特别强调下&#xff0c;必须是小图片&#xff0c;大小不要超过多少KB&#xff0c;等等。…

Flume监听多个文件目录,并根据文件名称不同,输出到kafka不同topic中

一、Flume监听多个文件目录 1. flume的环境搭建和基础配置参考 https://blog.csdn.net/qinqinde123/article/details/128130131 2. 修改配置文件flume-conf.properties #定义两个是数据源source1、source2 agent.sources source1 source2 agent.channels channel1 agent.…

B. Password(KMP)

Problem - 126B - Codeforces Asterix、Obelix和他们的临时伙伴Suffix和Prefix终于找到了和谐寺。然而&#xff0c;它的门被牢牢地锁住了&#xff0c;即使是Obelix也没能打开它们。 过了一会儿&#xff0c;他们发现在寺庙大门下面的一块岩石上刻着一个字符串。亚力认为那是打开…

realme手机配什么蓝牙耳机?realme蓝牙耳机推荐

蓝牙耳机作为人手必备的单品&#xff0c;不同厂商的产品更是多种多样&#xff0c;用户可以有更多的选择&#xff0c;选购蓝牙耳机的时候&#xff0c;除了看重佩戴舒适度、发声单元人们更加追求最新研发的技术。realme是为年轻人而来的科技潮牌。秉持“敢越级”品牌理念&#xf…

iOS MD5基础知识

MD5信息摘要算法&#xff08;英语&#xff1a;MD5 Message-Digest Algorithm&#xff09;&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完…

实现了Spring的Aware接口的自定义类什么时候执行的?

在之前的内容中 Spring的Aware接口有什么用&#xff1f;_轻尘的博客-CSDN博客_aware接口的作用 了解到用户可以通过实现相应的Aware接口来获取spring框架提供的能力&#xff0c;俗称“攀亲戚” 以如下代码为例&#xff0c;自定义类MyAware实现了BeanFactroryAware&#xff0…

数据库、计算机网络,操作系统刷题笔记5

数据库、计算机网络&#xff0c;操作系统刷题笔记5 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&…

【MySQL基础】MySQL常用的图形化管理工具有那些?

目录 一、为什么要使用MySQL图形化管理工具 原因 / 目的 / 作用 二、什么是DOS窗口? 三、常见的MySQL图形化管理工具有那些&#xff1f; 四、 常见几个MySQL图形工具的介绍 Navicat SQLyog MySQL Workbench DataGrip 五、Navicat图形工具的安装与使用 第一步&#x…

python带你制作随机点名系统,超级简单

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 在某些难以抉择得时候&#xff0c;我们经常要用外力来帮助我们做出选择 比如&#xff0c;课堂随机点名或面对活动需要人上台表演时等等场景 这个时候&#xff0c;有一个随机点名系统就非常好啦&#xff0c;毕竟运气得事~ …

QT之 给控件添加右键菜单

一、效果预览 二、代码 cpp文件 //listView右键菜单 void MainWindow::Rightclicklistview() {//初始化一级菜单TotalRightclick new QMenu(this);AddDevice new QMenu(this);upDevice new QAction(this);DownDevice new QAction(this);Delete new QAction(this);EditDev…

压缩包里的文件名可以这样隐藏起来

我们知道&#xff0c;压缩后的文件如果有保密需要&#xff0c;可以给压缩包设置打开密码。 设置密码后&#xff0c;还是可以打开压缩包&#xff0c;也可以看到压缩包里面的文件名称&#xff0c;当你点击里面的文件&#xff0c;才会提示需要输入密码后才能打开文件。 如果希望加…

数据运算——逻辑运算

数据运算——逻辑运算一、逻辑运算1.通过例题掌握位模式层次上的逻辑运算2.位模式层次上的逻辑运算的应用1.**与运算使指定位复位**2.**或运算使指定位置位**3.**异或运算使指定位取反**二、移位运算1.逻辑移位2.循环移位3.算术移位算术右移算术左移举例1>.(算术右移)2>.…

KepServer EX6模拟仿真PlC数据以及点表的复制跟项目的迁移

一.模拟plc数据绑定标点 1.新建通道选择“Simulator” 右击 “连接性”》新建通道选择Simulator 填写通道名称&#xff08;自定义&#xff09; 然后一直默认设置点击下一页知道完成!!! 添加展示 2.给通道添加设备 右击通道》添加设备 设备名自定义 然后一直默认进行下一步…

[附源码]计算机毕业设计springboot人事管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用WPS生成二维码,手机扫码访问主机的资源

问题描述 如果我们想要使用二维码&#xff0c;包装一个链接&#xff0c;访问目标资源。 在淘宝上可以看到&#xff0c;一些网店提供制作二维码服务。其实我们自己也可以做。 原理是&#xff1a;我们把资源发送给商家&#xff0c;商家拿到后&#xff0c;将资源部署到服务器上…

ARM cortex-M4核中断实验 中断和串口

要求&#xff1a;按键触发时&#xff0c;LED灯状态取反&#xff0c;并且在串口工具打印一句话。 KEY1按键按下&#xff0c;LED1状态取反&#xff0c;串口工具打印key1 down!!!! GPIO模块&#xff1a; UART模块&#xff1a; 主函数&#xff1a; 实验现象&#xff1a…

2022世界杯漫谈与猜想,谁是你心目中的第一

文章目录0、 我与足球1、卡塔尔世界杯2、亚洲球队水平3、中国足球4、展望0、 我与足球 1、第一次意义上的踢足球还是初中&#xff0c;记得是五四青年节说全校搞一场足球比赛&#xff0c;我们班莫名其妙的组了一个队&#xff0c;然后在放学后提提足球&#xff0c;那时候规则都不…

JSON端口操作实例

JSON 端口可直接实现在 JSON 和 XML 之间进行转换。端口会自动检测输入文件是 JSON 还是 XML&#xff0c;然后将文件在两种格式间相互转换。 该端口较多的是运用在API接口调用集成方案的项目当中&#xff0c;我们以百思买项目为例&#xff0c;知行之桥将接收到的百思买的EDI报…

针对海洋数据的管理三维gis软件系统有何优势

海洋地理信息系统是以深海、水质、海表层、空气及海岸带人类活动为研究对象,经过综合利用地理信息系统的室内空间海洋数据处理方法、GIS和绘图系统集成化、三维算法设计、海洋数据信息仿真模拟和界面显示等功能,为多种来源的数据信息给予协调性坐标、储存和集成化信息内容等专用…

springboot整合jett导出数据(2)

一 操作案例 1.1 pom文件 <dependency><groupId>net.sf.jett</groupId><artifactId>jett-core</artifactId><version>0.11.0</version></dependency> 1.2 代码 /*** author liujianfu* description 导出 环保指标查询…