基础算法---二分查找

文章目录

  • 基本思想
  • 1.数的范围
  • 2.搜索旋转排序数组
  • 3.搜索插入位置
  • 4.x的平方根
  • 总结

在这里插入图片描述

基本思想

二分查找的必要条件并不是单调,而是当我给定一个边界条件,然后左边满足这个边界条件,右边不满足这个边界条件,然后可以查找这个临界点,这就是二分查找
在这里插入图片描述
接下来我们具体讨论该怎么做

我们先讨论满足这个条件的一边,首先我们取mid=(l+r)/2,如果这个mid<x证明mid在x的左边,mid可能是边界所以要包含mid,所以将范围更新为[mid,r],如果mid>x,证明mid在x的右边,由于右边是不满足条件的,所以直接把mid舍去,更新范围为[l,mid-1],以此类推最后当l==r的时候,就是边界x

第二种:我们来讨论一下不满足条件的一边,如果我们需要找到右边界x,那么首先定义一个mid=(l+r+1)/2,如果mid<x证明不满足右边条件的在右边,所以要将mid舍去,将范围更新为[mid+1,r],如果mid>x证明mid在x的右边,所以满足右边的条件,由于右边都可能存在满足条件的,所以不能舍弃边界mid,所以将边界更新为[l,mid].

大致就分为上面两种情况,注意:如果是第二种情况的时候,需要+1,因为如果不向上取整的话,会造成死循环,如果不向上取整的话,当l=r-1的时候,意思就是当l和r相差1的时候,mid始终等于l这样就产生了死循环,但是如果向上取整的话,最后mid就等于r,就会跳出循环

接下来我们了解了基本算法来练习两道题:

1.数的范围

在这里插入图片描述

根据题目描述可以知道,这道题可以用二分查找

#include<iostream>
using namespace std;
//数组大小和需要的变量
const int N=100000;
int a[N];
int q,n;
int main()
{//输入变量cin>>n>>q;//初始化数组for(int i=0;i<n;i++)cin>>a[i];//q行数据while(q>0){//输入需要查找的数据int x;cin>>x;//先定义左右边界int l=0,r=n-1;while(l<r){//二分int mid=(l+r)/2;//边界条件if(a[mid]>=x)r=mid;else l = mid+1;}//出循环判断l对应的值是否和x相等,如果相等则继续,如果不相等则直接打印-1 -1if(a[l]!=x)cout<<"-1 -1"<<endl;else{//先输出上个循环的lcout<<l<<' ';//确定边界int l=0,r=n-1;//对右边界的条件进行二分while(l<r){int mid=(l+r+1)/2;//向上取整,防止死循环if(a[mid]<=x)l=mid;else r=mid-1;}//输出有边界cout<<l<<endl;}q--;}return 0;
}

2.搜索旋转排序数组

在这里插入图片描述

思路:首先这道题要求时间复杂度是O(logn),那么首先想到的就是二分,虽然这道题给的不是一个完整的有序的数组,但是是局部有序的 ,我们二分之后总是能保证左区间或者右区间是有序的,所以我们只需要判断一个有序区间是否存在这个数,如果不存在说明在另一个区间,直接else进入另一个区间,所以第一个大的if else是讨论左区间和右区间的有序性,第二个if else是讨论是在左区间或者右区间,去对这个数组的范围进行更新,范围条件,如果mid对应的值和target相等直接返回下标mid,如果最后不相等,直接跳出循环返回-1

代码展示

int search(int* nums, int numsSize, int target) {if(numsSize==1){return nums[0]==target?0:-1;}int l=0;int r=numsSize-1;while(l<=r){int mid=(l+r)/2;if(nums[mid]==target){return mid;}if(nums[mid]>=nums[l]){if(nums[mid]>target&&nums[l]<=target){r=mid-1;}else{l=mid+1;}}else{if(nums[mid]<target&&target<=nums[r]){l=mid+1;}else{r=mid-1;}}}return -1;
}

3.搜索插入位置

在这里插入图片描述

这道题也是一个简单的二分,注意边界条件即可

int searchInsert(int* nums, int numsSize, int target) {if(target>nums[numsSize-1]){return numsSize;}int l=0,r=numsSize-1;while(l<r){int mid=(l+r)/2;if(nums[mid]>=target)r=mid;else l=mid+1;}return l;
}

4.x的平方根

在这里插入图片描述

这道题是一道简单的二分

首先定义左边界和右边界,然后定义一个范围值ans,然后进行二分如果中间值的平方<=x说明答案在右边,将ans更新,然后更新区间范围,如果两个数的乘积大于x的话说明在在区间的左边,所以更新r,由于我们需要的是向下取整,所以在更新l的时候,就直接更新ans,如果在r变化的时候更新ans会使最后的ans变大

int mySqrt(int x) {int l=0;int r=x;int ans=-1;while(l<=r){int mid=(l+r)/2;if((long long)mid*mid<=x){ans=mid;l=mid+1;}else{r=mid-1;}}return ans;
}

总结

当你理解了二分查找的原理,并且掌握了它的实现方法,你就掌握了一种高效查找数据的技巧。二分查找是一种简单而又强大的算法,在处理大规模数据时能够显著提高搜索效率。通过不断地练习和应用,你可以在编程的世界里更加游刃有余地运用这一技巧。希望本文对你有所启发,能够帮助你更深入地理解二分查找算法,并在实际应用中发挥其作用。在编程的道路上,不断学习,不断进步,愿你能够越走越远,探索更多的算法与数据结构的奥秘。

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

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

相关文章

华火电燃灶:烹饪艺术与科技创新的完美融合

华火电燃灶&#xff0c;以纯净电力激发明火之美&#xff0c;无须燃气&#xff0c;尽释碳负。每一道佳肴背后&#xff0c;都是对安全与健康的无声誓言&#xff0c;为家庭温馨瞬间添上一抹灿烂。从宝贝初声啼哭到晚年宁静美好&#xff0c;华火见证家的每一次幸福团聚&#xff0c;…

DevOps流程的简单总结

DevOps流程图&#xff1a; DevOps流程包含&#xff1a;计划&#xff08;plan&#xff09;、编码(code)、编译(build)、测试(test)、发布(release)、部署(deploy)、运营(operate)、监控&#xff08;monitor&#xff09;&#xff0c;这是一个循环的过程。DevOps是依托容器、自动化…

流程控制:goto语句,模拟switch语句

示例&#xff1a; /*** brief how about goto-switch? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>static …

涉密人员离职,如何一键锁定他的电脑屏幕

在任何情况下&#xff0c;保护企业数据的安全性和机密性都是非常重要的。如果涉密人员离职&#xff0c;应该遵循相关的保密协议和规定&#xff0c;确保企业数据的完整性和安全性。同时&#xff0c;也应该对员工进行适当的培训和教育&#xff0c;提高他们的安全意识和技能水平。…

【c++】cpp数学库函数、随机数和时间库函数

&#xff08;1&#xff09;cpp数学库函数 #include <iostream>using namespace std;#include <cmath> //数学函数库的头文件#define pi 3.1415926 //定义一个常量π int main() {cout << "平方数:pow(3, 2) :" << pow(3, 2) << endl;…

selenium‘拟人包装‘设置

1、设置header,proxy 1.1关于user-agent 输入about:version 找到user-agent: import requests # 引用requests库 from selenium import webdriver#载入浏览器驱动#header&#xff0c;proxy设置 optionswebdriver.ChromeOptions()#实例化浏览器参数设置options.add_argument…

水电远程预付费系统:创新与便利的融合

1.系统概述 水电远程预付费系统是一种现代化的管理工具&#xff0c;它通过先进的信息技术实现了水电费用的预先支付和远程管理。这种系统不仅提高了服务效率&#xff0c;也为用户带来了极大的便利&#xff0c;减少了传统抄表和收费过程中的诸多不便。 2.功能特性 2.1实时计量…

pycharm创建的项目

pycharm生成django templates删出 settings.py

nvidia-smi CUDA Version:N/A

问题 nvidia-smi显示&#xff1a;CUDA Version:N/A nvidia-smi -a显示&#xff1a;CUDA Version: Not Found 解决方法 查看Nvidia驱动版本 nvidia-smi如下图&#xff0c;版本为530.41.03 搜索cuda库 apt search libcuda注&#xff1a;不同的源&#xff0c;同一个库的命…

【JavaSE】JDK17的一些特性

前言 从springboot3.0开始&#xff0c;已经不⽀持JDK8了 选⽤Java17&#xff0c;概括起来主要有下⾯⼏个主要原因 JDK17是LTS(⻓期⽀持版)&#xff0c;可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版&#xff08;JDK9-JDK16&#xff09; 去其糟粕&#xff0c;取其精华的版本JDK17…

用友 NC showcontent SQL注入漏洞复现

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术&#xff0c;旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /ebvp/infopub/showcontent 接口处…

AndroidStudio右下角显示内存使用情况

目录 一.具体效果 二.4.0以下版本 三.4.0以上版本 四.增加内存配置 一.具体效果 二.4.0以下版本 1.打开 Android Studio. 2.进入设置界面。点击 Android Studio 左上角的“File”&#xff0c;然后选择“Settings” 3.在设置界面中&#xff0c;选择“Appearance & Beha…

机器学习理论公式推导及原理—决策树

机器学习公式推导及原理—决策树 根据西瓜书中的公式与内容来进行推导和实现 算法原理 从逻辑角度&#xff0c;一堆if else语句的组合从几何角度&#xff0c;根据某种准则划分特征空间。最终目的&#xff1a;将样本越分越“纯。 信息熵的概念 自信息&#xff1a;是指随机变量…

【汇编语言】初识汇编

【汇编语言】初识汇编 文章目录 【汇编语言】初识汇编前言由机器语言到汇编语言机器语言与机器指令汇编语言与汇编指令汇编语言程序示例 计算机组成指令和数据的表示计算机的存储单元计算机的总线 内存读写与地址空间CPU对存储器的读写内存地址空间 总结 前言 为什么要学习汇编…

29. 【Android教程】折叠列表 ExpandableListView

本节学习一个可折叠的 ListView&#xff0c;可以用在一些需要分类的场景下。通过 ExpandableListView 我们可以首先在 ListView 上展示大的分类&#xff0c;当点击某个类别的时候再将 ListView 做一个展开&#xff0c;展示该类下的所有子类供用户选择。它与 ListView 的不同主要…

【八股文】Spring 谈谈你对AOP的理解

AOP AOP(Aspect-Oriented Programming&#xff0c;面向切面编程)&#xff1a;是一种新的方法论&#xff0c;是对传统 OOP(Object-Oriented Programming&#xff0c;面向对象编程)的补充。 面向对象是纵向继承&#xff0c;面向切面是横向抽取。 OOP思想是一种垂直纵向的继承体…

【Excel】使用VBA宏简单自定义Excel软件界面

改行做经济师学习Excel&#xff0c;偶有心得&#xff0c;摘录于此&#xff0c;备忘。 言简意赅&#xff0c;仅供自用。 1 实现效果 在Excel的左上角可添加按钮&#xff0c;该按钮的功能可由我们自己通过编写代码定义&#xff0c;能实现特定功能&#xff0c;并且在所有打开的…

攻防世界---reverse_re3

1.下载附件&#xff0c;先查壳&#xff1a;无壳 2.在IDA中分析&#xff0c;shiftfnf5&#xff0c;看到一串长得很像flag的flag 3.根据提示我们需要找到输入&#xff0c;再进行md5转换才能得到flag flag{md5(your input)} 4.双击这个句话&#xff0c;点进去想查看信息&#xff0…

hive搭建完整教学

目录 简介准备工作安装步骤&#xff08;一&#xff09;、下载hive包并解压到指定目录下&#xff08;二&#xff09;、设置环境变量&#xff08;三&#xff09;、下载MySQL驱动包到hive的lib目录下&#xff08;四&#xff09;、将hadoop的guava包拷贝到hive&#xff08;五&#…

SS3D翻译

SS3D AbstractIntroductionRelated WorkFully-Supervised 3D Object DetectionWeakly/Semi-Supervised 3D Object DetectionSparsely-Supervised 2D Object Detection MethodOverall FrameworkArchitecture of DetectorMissing-Annotated Instance Mining Module 缺失注释实例挖…