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

初识算法 · 二分查找(1)

目录

前言:

二分查找

题目解析

算法原理

算法编写

搜索插入位置

题目解析

算法原理

算法编写


前言:

本文呢,我们从滑动窗口窗口算法移步到了二分查找算法,我们简单了解一下二分查找算法,二分查找算法是一个十分恶心,十分注重细节,但是同时也是十分简单的一个算法,有人好奇,注重细节和简单怎么能挂的上关系呢?这是因为二分查找对于边界的处理是尤其要小心的,所以对于二分查找来说,将边界处理好了,自然就简单多了,相当于套了一个模板。那么本文呢,通过两个题目,简单介绍一下二分查找算法。

704. 二分查找 - 力扣(LeetCode)

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

本文的讲解呢,通过三部曲,是题目解析,二是算法原理,三是算法编写,那么,话不多说,直接进行主题咯。


二分查找

题目解析

题目的名称是二分查找,非常朴素的一个标题,根据题目要求,需要我们找到target所在位置。并且返回对应对应的下标,如果没有就返回-1。

那么根据题目,我们能得到的有效信息还有一个是升序。这个条件对于二分查找来说,是十分重要的,之后的二分查找算法,我们本质上不是非要找一个有序的数组才能使用,而是我们需要找到某种特定的规律,可以将整个数据区间划分为两端,简称为二段性,而因为二分查找实际上也是双指针,但是因为特别突出,所以单独拿出来,通过某种特定的规律。实现某种需求,这是二分

暴力解法都不用说,直接就是一个循环搞定,但是自然时间复杂度是O(N),如果是其他题目,O(N)已经是很快了,但是如果有42亿个数字呢?查找42亿次不免太慢了。

所以我们进入到算法原理部分。

算法原理

通过题目解析,我们知道了如果直接遍历,是O(N),相对来说比较高,那么我们从暴力解法中优化。

比如我们查找的区间是1,2,3,4,5,6,7,8,9。查找的target是5,我们选取任意一点,比如7,因为数组是有序的,所以7后面的数都比5大,我们就不用去7的后面找了。这就是优化,即选取特定的点,从该点开始改变左右指针的位置,一次性干到一大片的数据。

那么此时点的选择就尤为重要了,如果是选择三分之一的位置,运气好点,可能就会将三分之二的数据干掉,在数学中,有一个词叫做数学期望,我们肯定是期望能一次干掉最多的数据,最保险的肯定就是从中间开始选择点。

那么边界处理部分,也就是判断之后如果大于left指针怎么移动或者是right指针怎么移动,这是要考虑的。

所以最朴素的二分查找,无非就是确定左右中指针,判断,改变指针位置,每次干掉一半的数据,就这么多,没有了,那么还有两种模板,我们放在后面介绍。

算法编写

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

首先判断结束条件是left是否超过了right,如果超过肯定是不可以的,因为是二分查找,所以最坏的情况也就是查找到最后一个数据,也就是区间只有一个数据,此时left是等于right的。

那么关于mid,使用left + (right - left + 1) / 2主要是为了防止溢出,如果直接(right + left) / 2,可能来整型相加会有溢出的风险,所以left + (right - left) / 2是为了放溢出,至于+1和不加一这道题是没有区别的。

这是最经典的二分查找算法,时间复杂度显然为O(logN),为什么二分查找快呢?如果查找42亿个数,暴力需要找42亿次,二分查找只需要找32次,十分的快。


搜索插入位置

题目解析

这个题目可以说是上一个题目的翻版,不过是多加了一个要求,如果没有找到对应的元素,我们就应该返回按顺序插入的下标。

那么这里,其实是使用了除了朴素模板的另外模板的,至于是什么,我们防在第二篇二分查找里面介绍。题目信息还有一个升序,也就没有什么了,这个题目一看就是二分查找,所以暴力解法咱也就不说了。

直接进入算法原理部分。

算法原理

我们做二分查找算法的题目的时候,第一个肯定是要找什么可以导致二段性,这道题是升序吗?还是target和其他位置的大小关系呢?

实际上,对于是否能不能找到该数据是不重要的,我们应该关心的是,如何插入的问题?

我们可以将数据区间分为[left,index] [index + 1,right],而left所在的区间是比target小的,我们根据示例分析,就可以最后插入是只要找到刚好比target大的那个数就可以,也就是左区间的最后一个数。

所以如果Mid小于target,left = mid + 1就可以了,那么如果mid > target,right = mid,因为mid如果落在了右区间,是有可能找到最后我们的答案的。

这个基本模板套出来,题目也就做出来了,但是我们要防止的是如果插入的位置是数组之外,就应该另外判断一下。

算法编写

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

感谢阅读!

相关文章:

初识算法 · 二分查找(1)

目录 前言&#xff1a; 二分查找 题目解析 算法原理 算法编写 搜索插入位置 题目解析 算法原理 算法编写 前言&#xff1a; 本文呢&#xff0c;我们从滑动窗口窗口算法移步到了二分查找算法&#xff0c;我们简单了解一下二分查找算法&#xff0c;二分查找算法是一个十…...

数据结构:数字统计

请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&#xff0c;在数21中出现1次&#xff0c;在数22中出现2次&#xff0c;所以数字2在该范围…...

网页前端开发之HTML入门

HTML入门 HTML全称HyperText Markup Language&#xff0c;中文译为&#xff1a;超文本标记语言。 它有一个同胞兄弟叫&#xff1a;XML&#xff0c;全称Extensible Markup Language&#xff0c;中文译为&#xff1a;可扩展标记语言。 简单来讲&#xff0c;它们都是标记语言。 …...

Python do while 实现案例

在 Python 中没有传统的 do while 循环语法。 但是可以通过使用 while True 结合条件判断来实现类似 do while 的效果。 一、语法 while True:# 执行某些操作#...if not condition:break 这里先无条件地执行一次循环体中的代码&#xff0c;然后在每次循环结束时检查条件&#…...

docker网络管理详解 一

一 生产故障&#xff1a;docker 同一宿主机不能通信 1. 检查容器网络配置 1.1 查看容器的网络信息 使用 docker inspect 命令查看容器的网络配置&#xff0c;确保它们连接到了正确的网络。 docker inspect -f {{json .NetworkSettings.Networks }} container1 docker inspe…...

前端使用Canvas实现网页电子签名(撤销、下载)

前言&#xff1a;一般在一些后台的流程资料以及审核的场景中会需要电子签名&#xff0c;介绍一种用canvas实现的电子签名&#xff0c;此案例用的是原生js 效果展示&#xff1a; 一、html和css&#xff1a; <div class"divCla2"><canvas id"myCanvas&q…...

Lepus安装与配置管理(Lepus Installation and Configuration Management)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...

Tomcat中存放图片文件丢失问题

1、tomcat中存放的图片丢失原因&#xff1a; tomcat 在处理 WAR 包时&#xff0c;会在部署时解压 WAR 包并创建文件夹。如果在 tomcat 运行时删除了 WAR 包&#xff0c;tomcat会检测到这种变化&#xff0c;然后可能会自动清理已解压的文件夹。这是tomcat默认的行为&#xff0c;…...

Webpack一键打包多个环境

1. 安装打包插件 安装如下插件&#xff0c;以便可以在打包命令中设置环境变量区分不同的环境。 npm install --save-dev cross-env 2. 配置打包命令 在package.json中配置正式环境和测试环境打包命令&#xff0c;同时添加一个命令同打包两个环境。 // package.json "…...

Neo4j 构建文本类型的知识图谱

Neo4j 是一个强大的图数据库&#xff0c;用于构建和查询各种类型的图数据结构。构建知识图谱是一项常见任务&#xff0c;尤其在处理自然语言处理 (NLP) 和文本信息时。基于 Neo4j&#xff0c;可以将文本数据转换为知识图谱&#xff0c;使得复杂的文本关系以图结构存储&#xff…...

【SSM详细教程】-03-Spring参数注入

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课…...

深度学习 %matplotlib inline

%matplotlib inline 是在 Jupyter Notebook 中使用的一个魔法命令&#xff0c;主要用于配置 Matplotlib 图形的显示方式。具体来说&#xff0c;这个命令的作用是将 Matplotlib 生成的图形直接嵌入到 notebook 中&#xff0c;而不是在弹出的窗口中显示。 使用方法 在 Jupyter …...

RT-Thread线程的定义和属性

目录 概述 1 RT-Thread线程定义 1.1 优先级设定方法 1.2 内存管理 1.2.1 RT-Thread的线程类别 1.2.2 RT-Thread的线程调度 2 线程重要属性 2.1 线程栈 2.2 线程状态 2.3 线程优先级 2.4 时间片 概述 本文主要介绍RT-Thread线程的定义和属性&#xff0c;其包括线程的…...

【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦

背景 接上一篇&#xff0c;【大模型问答测试】大模型问答测试脚本实现&#xff08;第一版&#xff09;。 在实现自动化的时候&#xff0c;原先把很多方法与request请求写在一块了&#xff0c;趁着目前实现接口数量较少&#xff0c;决定对代码进行解耦&#xff0c;并且清晰目录…...

Windows模拟电脑假死之键盘鼠标无响应

Windows模拟电脑假死之键盘鼠标无响应 1. 场景需求 模拟Windows电脑假死&#xff0c;失去键盘鼠标响应。 2. 解决方案 采用Windows系统提供的钩子(Hook) API 拦截系统鼠标键盘消息。 3. 示例程序 【1】. 创建MFC对话框项目 新建一个MFC应用程序项目&#xff0c;项目名称…...

一文详解线程池

什么是线程池&#xff1f; 线程池&#xff1a;就是一个容纳多个线程的容器&#xff0c;其中的线程可以反复使用&#xff0c;省去了频繁创建线程对象的操作&#xff0c;无需反复创建线程而消耗过多资源。 为什么用线程池&#xff1f; 线程池的优势&#xff1a;线程池做的工作…...

网际报文协议ICMP及ICMP重定向实例详解2

之前在一个项目中遇到了与ICMP重定向相关的问题&#xff0c;因为缺乏对ICMP相关内容的了解&#xff0c;排查了很长一段时间才查出来。本文给大家简要地介绍一下ICMP及ICMP重定向相关的内容。 1、ICMP的概念 ICMP&#xff08;Internet Control Message Protocol&#xff09;网际…...

CSS 总结

CSS 总结 引言 CSS(层叠样式表)是网页设计中不可或缺的一部分,它用于控制网页的布局和样式。本文将对CSS的基本概念、关键特性、常用属性以及最佳实践进行总结,旨在帮助读者深入理解并有效运用CSS。 CSS基本概念 1. 什么是CSS? CSS是一种样式表语言,用于描述HTML或X…...

C语言_指针_进阶

引言&#xff1a;在前面的c语言_指针初阶上&#xff0c;我们了解了简单的指针类型以及使用&#xff0c;下面我们将进入更深层次的指针学习&#xff0c;对指针的理解会有一个极大的提升。从此以后&#xff0c;指针将不再是难点&#xff0c;而是学习底层语言的一把利器。 本章重点…...

chat_gpt回答:python使用writearray写tiff速度太慢,有什么快速的方法吗

如果你在使用 Python 的 tifffile 库&#xff08;或类似库&#xff09;写入 TIFF 文件时速度太慢&#xff0c;以下是几个加速写入的优化方法和替代方案&#xff1a; 1. 优化文件压缩设置 TIFF 支持压缩格式&#xff0c;但压缩过程可能非常耗时。如果你不需要压缩&#xff0c;…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...