模块三——二分:704.二分查找

文章目录

  • 前言
  • 二分查找算法简介
    • 特点
    • 学习中的侧重点
      • 算法原理
      • 模板
  • 题目描述
  • 算法原理
    • 解法一:暴力解法
    • 解法二:二分查找算法
      • 算法流程
      • 细节问题
        • 循环结束的条件
        • 为什么是正确的?
        • 时间复杂度
  • 代码实现

前言

本系列博客是逐渐深入的过程,建议从零开始学习的友友不要跳过一些中间的博客。

二分查找算法简介

特点

最恶心,细节最多,最容易写出死循环的算法。

学习中的侧重点

算法原理

二分查找算法一定是数组有序的情况?答案显然是否定的,只要具有二段性就能使用二分查找算法。

模板

PS:不要死记硬背,要理解性记忆。

  1. 朴素的二分模板(easy但有局限)
  2. 查找左边界的二分模板(万能,细节多)
  3. 查找右边界的二分模板(万能,细节多)
//朴素二分模板
while(left <= right){int mid = left + (right - left) / 2;//防止越界,等价于left + (right - left + 1) / 2;//PS:为偶数时前者为中间两数的左数,后者为右数if(...)left = mid + 1;else if(...)right = mid - 1;elsereturn ...;
}
//查找区间左端点的模板
while(left < right){int mid = left + (right - left) / 2;if(...)left = mid + 1;else right = mid;
}
//查找区间右端点的模板
while(left < right){int mid = left + (right - left + 1) / 2;if(...)left = mid;else right = mid - 1;

PS:分类讨论的代码,就题论题即可。

题目描述

题目链接:704.二分查找
在这里插入图片描述
题目很简单,就是在升序数组中搜索目标值target。

算法原理

解法一:暴力解法

直接遍历一遍数组即可,时间复杂度为O(N)

解法二:二分查找算法

算法流程

  • 定义 left ,right 指针,分别指向数组的左右区间。
  • 找到待查找区间的中间点 mid ,找到之后分三种情况讨论:
  1. arr[mid] == target 说明正好找到,返回 mid 的值;
  2. arr[mid] > target 说明 [mid,right] 这段区间都是⼤于 target 的,因此舍去右边区间,在左边[left, mid -1] 的区间继续查找,即让right = mid - 1 ,然后重复找mid过程;
  3. arr[mid] < target 说明 [left, mid]这段区间的值都是⼩于 target 的,因此舍去左边区间,在右边[mid + 1, right] 区间继续查找,即让 left =mid + 1 ,然后重复 找mid过程;
  • 当 left 与 right 错开时,说明整个区间都没有这个数,返回 -1 。

细节问题

循环结束的条件

left > right

为什么是正确的?

暴力解法是一次一次比较,但二分是利用了数组有序的特性,即二段性来通过比较一次来去掉多余的比较,所以暴力解法既然是正确的,那么二分也是正确的。

时间复杂度

第一次循环把区间划分成n/2,第二次是n/4,直到最坏情况下循环x次,而最后只剩下一个元素。n / 21,n / 22,n / 23…n / 2x——>2x = n——>x = logN。

代码实现

class Solution {
public:int search(vector<int>& nums, int target) {//二段性可用二分int left = 0;int right = nums.size() - 1;//结束条件while(left <= right){//直接加有可能会超出int的范围//int mid = (left + right) / 2;//换成减法防止溢出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;}
};

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

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

相关文章

BCLinux8U6系统部署oceanbase分布式数据库社区版之一、准备 OBD 中控机

本文记录了在BCLinux8U6操作系统的虚拟服务器准备oceanbase开源数据库的 OBD 中控机的过程。 一、中控机环境 1、虚拟服务器硬件配置 2、操作系统版本信息 [rootlocalhost ~]# cat /etc/os-release NAME"BigCloud Enterprise Linux" VERSION"8.6 (Core)&qu…

【链表】Leetcode 两数相加

题目讲解 2. 两数相加 算法讲解 我们这里设置一个头结点&#xff0c;然后遍历两个链表&#xff0c;使用一个flag记录相加的结果和进位&#xff0c;如果两个链表没有走到最后或者进位不等于0&#xff0c;我们就继续遍历处理进位&#xff1b;如果当前的链表都遍历完成了&#x…

移动Web学习08-响应式布局bootstrap的使用

2、响应式布局 2.1、什么响应式布局 响应式布局是一种网页设计的方法&#xff0c;能够使网站在不同的设备上&#xff08;如桌面电脑、平板电脑、手机等&#xff09;呈现出最佳的用户体验。其核心思想是使网页能够根据用户的设备和屏幕尺寸自动调整布局和内容&#xff0c;以适…

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水 503. 下一个更大元素 II题目解法 42. 接雨水题目解法 感悟 503. 下一个更大元素 II 题目 解法 题解链接 使用两个size class Solution { public:vector<int> nextGreaterElements(vector<in…

【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法)

目录 UDP协议 UDP协议的报文结构及注意事项 UDP报文结构中的校验和字段 1. 校验和主要校验的内容 2. UDP校验和的实现方式 3. CRC&#xff08;循环冗余校验&#xff09;算法 4. MD5&#xff08;Message Digest Algorithm 5&#xff09; UDP协议 上一篇文章提过&#xf…

计算机网络实验——学习记录五(TCP协议2)

一、TCP协议重传机制 TCP协议是一种面向连接、可靠的传输层协议。为了保证数据的可靠传输&#xff0c;TCP采用数据包重传的机制来应对网络传输过程中可能出现的丢包、错包和乱序等问题。 TCP协议的重传包括超时重传、快速重传、带选择确认SACK的重传和重复SACK重传四种。 二、…

grafana安装篇(1)

目录 grafana概念&#xff1a; 它具有以下主要特点&#xff1a; Grafana 常用于以下场景&#xff1a; 环境介绍&#xff1a; 前置环境&#xff1a; (1)保证可以连接外网 (2)防火墙和selinux已关闭 1.下载安装grafana10.0.1-1rpm包 2.启动grafana 3.浏览器访问 3.设置…

实验2 NFS部署和配置

一、实训目的 1.了解NFS基本概念 2.实现NFS的配置和部署 二、实训准备 1.准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 2.该计算机应安装CentOS 7&#xff0c;建议采用CentOS 7.8版本。 3.准备两台虚拟机机&#xff08;客户机和服务器机&…

Linux CPU 占用率 100% 排查

其他层面要考虑到的地方 mysql&#xff0c;有执行时间特别长的sql、死锁redis雪崩等相关问题并发导出数据量大Java定时器服务业务复杂&#xff0c;比如像每天要更新电商的统计表&#xff0c;每天发送优惠券等业务需要提前计算才能保证业务使用时的流畅性&#xff0c;我这个原因…

leetcode最大间距(桶排序+Python)

虽然直接排完序&#xff0c;再求最大差值更快&#xff0c;这里我们还是学一下桶排序。 桶排序主要维护一个bucket&#xff0c;初始bucket【i】 0&#xff0c;遍历nums&#xff0c;当i存在时&#xff0c;令bucket【i】 1&#xff0c;表示存在。遍历完nums&#xff0c;bucket中有…

DiT解读:当Diffusion遇上Transformer

前置知识 ViT Vision Transformer是一种基于Transformer架构的深度学习模型&#xff0c;专门用于处理计算机视觉任务。他的1出现给以往CNN base的图像工作带来了很多新的可能性 ViT的核心思想是将图像分割成均匀的图像块&#xff0c;然后将这些图像块转换为序列&#xff0c;…

【LAMMPS学习】八、基础知识(3.8)计算扩散系数

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

4.点云数据的配准

1.点云配准ICP(Iterative Closest Point)算法 点云配准的原理及ICP(Iterative Closest Point)算法原理参照博客【PCL】—— 点云配准ICP(Iterative Closest Point)算法_icp点云配准-CSDN博客。 &#xff08;1&#xff09;点云配准原理&#xff1a;三维扫描仪设备对目标物体一…

Learn ComputeShader 02 Multiple kernels

前面已经成功创建了第一个compute shader&#xff0c;并且使用它替换掉quad的材质的纹理&#xff0c;现在我们将要在计算着色器中创建多个kernel。 首先调整上次的计算着色器&#xff0c;让它显示为红色。 然后再次创建一个kernel&#xff0c;显示为黄色。 结果应该是这样的…

mysql基础2——字段类型

整数类型 需要考虑存储空间和可靠性的平衡 浮点类型 浮点数类型不精准 将十进制数转换为二进制数存储 浮点数类型&#xff1a;float double real(默认是&#xff0c;double ) 如果需要将real设定为float &#xff0c;那么通过以下语句实现 set sql_mode "real_as…

52 文本预处理【动手学深度学习v2】

将文本作为字符串加载到内存中。 将字符串拆分为词元&#xff08;如单词和字符&#xff09;。 建立一个词表&#xff0c;将拆分的词元映射到数字索引;将文本转换为数字索引序列&#xff0c;方便模型操作。

我在本地部署通义千问Qwen1.5大模型,并实现简单的对话和RAG

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

WordPress 告别 MySQL:Docker SQLite WordPress

本篇文章聊聊&#xff0c;如何将这个持续诞生和维护了 21 年的开源软件“脱离数据库”运行&#xff0c;让它能够更加轻量、适合低成本离线运行。 写在前面 2003 年&#xff0c;Michel Valdrighi 基于 b2/cafelog 创建了开源软件 WordPress&#xff0c;并在 GPL 协议下发布。 …

(一)Java EE企业级应用开发实战之Servlet教程——JDK安装

首先打开清华大学开源软件镜像站&#xff0c;清华大学开源镜像网站地址为&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/ 打开该地址后的界面显示如下图所示 找到8版本对应的SDK安装包&#xff0c;我现在用的开发机器是Windows&#xff0c;所以我找的是Windows对应的版本…

[柏鹭杯 2021]试试大数据分解?

题目&#xff1a;&#xff08;NSSCTF | 在线CTF平台&#xff09; 题目就是如此&#xff0c;我没看到有5个不同的文本&#xff0c;其中最后一个文本以pem后缀&#xff0c;所以我们先来了解一下什么是pem格式。 PEM 格式 PEM格式通常用于数字证书认证机构&#xff08;Certifica…