数据结构和算法:二分法

文章目录

  • 一:最基本的二分法
      • 使用else if收缩空间,思路更清晰
      • 防止数据太大溢出int的范围
      • 什么情况使用while(left <= right)?为什么这个时候right = nums.length - 1?
      • 什么情况使用while(left < right)?为什么这个时候right = nums.length?
      • 缺陷
  • 二:存在重复元素,寻找左边界的二分查找
  • 三:存在重复元素,寻找右边界的二分查找

一:最基本的二分法

在这里插入图片描述

使用else if收缩空间,思路更清晰

不要出现搜寻空间不要使用else,而是使用else if,把所有的条件都写得清清楚楚,理解更清晰

防止数据太大溢出int的范围

mid = left + (right - left )/2

优化:mid = left + (right - left ) >> 1 ,位移运算,效率更高

什么情况使用while(left <= right)?为什么这个时候right = nums.length - 1?

1.左闭右闭的时候,即搜索区间是[left,right]。终止条件是区间等于[left,left - 1]的时候。
例如[1,1]这个区间还有意义,还要搜索一次。但是[0,1]这个区间没有意义了,可以停止搜索了
2.因为搜索区间是[left,right],right边界可以等于后一个元素的索引。假如right = nums.length的话就越界了

什么情况使用while(left < right)?为什么这个时候right = nums.length?

1.因为这个时候是左闭右开搜索区间,即搜索区间是[left,right),终止条件是left == right,因为[1,1)是没有意义的,可以停止搜索了。
2.因为搜索区间是[left,right),right边界不包含最后一个元素的,所以right搜索边界要比最后一个元素下标+1.

缺陷

无法查找有序数组中目标值的左右边界

二:存在重复元素,寻找左边界的二分查找

在这里插入图片描述

锁定target,收缩右边界的时候使用:right = mid

如果不存在target的时候怎么处理?
假如在nums = {2,3,5,7},target = 1,那么算法返回0,
假如target=8,会返回4.
加个判断:return nums[left] == target ? left : -1;

运行结果:

找到重复target的左边界:
范围内,存在 1
范围内,不存在 2
范围左边,不存在 0
范围右边,不存在 4

三:存在重复元素,寻找右边界的二分查找

在这里插入图片描述

锁定target,收缩左边界的时候使用:left = mid + 1,最后一次收缩会导致下标+1,所以最后需要left - 1。
假如在nums = {2,3,5,7},target = 1,那么算法返回-1,
假如target=8,会返回3.

运行结果:

找到重复target的右边界:
范围内,存在 1
范围内,不存在 1
范围左边,不存在 -1
范围右边,不存在 3

添加边界处理条件

//因为是通过 left = mid + 1进行收缩右边界,所以最后的时候一定会往后多移动了一位下标。
int bound = left - 1;
//假如找不到右边界,
if (bound == -1) return -1;
/* return left - 1;*/
return nums[bound] == target ? bound : -1;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker 概念介绍

1、Docker 简介 Docker一个快速交付应用、运行应用的技术: 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通过一行命令完成&#xff0c;方便快捷 Doc…

RustDesk连接客户端提示key不匹配 Key Mismatch无法连接(已解决)

环境: RustDesk1.1.9 服务端docker部署 问题描述: RustDesk连接客户端提示key不匹配 Key Mismatch无法连接 解决方案: 1.docker部署RustDesk服务检查配置 networks:rustdesk-net:external: falsevolumes:hbbr:hbbs:services:hbbs:container_name: rustdesk-hbbsport…

【SpringBoot篇】优惠券秒杀 — 添加优惠劵操作(基本操作 | 一人仅一张券的操作)

文章目录 &#x1f354;发放优惠券&#x1f386;基本操作&#x1f384;数据库表&#x1f6f8;思路&#x1f339;代码实现 &#x1f386;完善后的操作&#x1f6f8;乐观锁&#x1f339;代码实现 &#x1f354;一人仅一张优惠券&#x1f6f8;思路&#x1f339;代码⭐代码分析 &am…

微信小程序开发系列-05登录小程序

本文继续学习下微信小程序登录相关的内容。 微信平台小程序用户体系 普通用户视角&#xff1a;对于每个小程序&#xff0c;微信都会将用户的微信ID映射出一个小程序OpenID&#xff0c;作为这个用户在这个小程序的唯一标识。&#xff08;注意&#xff1a;同一微信用户在不同小…

unityc用vs2017介绍

21版unity能用17vs&#xff0c;只要在unity的Edit/Preferences/ExternalTools里面改既可。

继承-继承方式

继承方式 继承的语法: class 子类 &#xff1a;继承方式 父类 继承方式一共有三种&#xff1a; 1.公共继承 2.保护继承 3.私有继承 //继承方式 #include<iostream> using namespace std; class Base1 { public:int m_A; protected:int m_B; private:int m_C; }; cla…

卷积神经网络基础

全连接层 BP&#xff08;back propagation&#xff09;算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行&#xff0c;而调整权值和阈值则从输出到输入的方向进行。 误差值&#xff1a;将输出值和所期望的值进行对比&#xff0c;可以…

设备智能运维利器:无线振温一体式传感器

在现代工业领域中&#xff0c;设备的状态监测和维护是确保生产正常运行的关键环节。随着技术的不断进步&#xff0c;传感器在设备监测中发挥着越来越重要的作用。其中&#xff0c;无线振温一体式传感器作为设备智能运维的利器&#xff0c;具有独特的优势和潜力。本文将介绍无线…

C++ Qt开发:TableView与TreeView组件联动

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TableView与TreeView组件联动的常用方法及灵活…

Transfer Learning(迁移学习)

1. 什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数机器学习算法都…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

强光led电筒控制芯片方案:OC5338

强光LED电筒控制芯片OC5338是一款内置100V/3A功率MOS的高性能芯片方案。它具有多种功能&#xff0c;包括100%输出、25%输出和爆闪。此外&#xff0c;它还具有宽输入电压范围&#xff0c;从3.6V到100V&#xff0c;并且具有高达90%的高效率。 强光led电筒控制芯片方案:OC5338 L…

C#与VisionPro联合编程

C#与VisionPro联合 1. 参照康耐视提供的样例2. 参照样例写一个1. 创建工程2. 添加引用3. 声明变量4. 初始化5. 刷新队列6. 用户数据获取7. 跨线程访问Windows控件--委托8. 显示图像9. 释放资源 3. 代码4. 资源下载 1. 参照康耐视提供的样例 C:\Program Files\Cognex\VisionPro…

【Linux操作系统】命令补全

补全命令 快捷键&#xff1a;Tab 示例&#xff1a; 在终端中输入“ifc”&#xff0c;按Tab键&#xff0c;自动补全为“ifconfig”命令——查询IP地址。

k8s的二进制部署

k8s的二进制部署&#xff1a;源码包部署 k8smaster01: 20.0.0.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8smaster02: 20.0.0.102 kube-apiserver kube-controller-manager kube-scheduler node节点01: 20.0.0.103 kubelet kube-proxy etcd node节点02…

最优化考试之牛顿法

最优化考试之牛顿法 一、牛顿法1.问题条件2.求解过程3.例子 PS 一、牛顿法 1.问题条件 目标函数 f ( x ) f(x) f(x)&#xff0c;求极小值初始点 x 0 x_0 x0​精度要求e&#xff08;没有提就是近似0&#xff09; 2.求解过程 求解一阶雅克比矩阵 ∇ f ( x ) ∇f(x) ∇f(x)和二…

Jmeter接口工具大全使用—响应断言

断言的作用&#xff1a;一个HTTP请求发出去&#xff0c;怎么判断执行的任务是否成功呢&#xff1f;通过检查服务器响应数据&#xff0c;是否返回预期想要的数据&#xff0c;如果是&#xff0c;判断任务成功&#xff0c;反之任务失败。 1.添加断言 选中一个取样器&#xff0c;…

少走弯路:单片机使用点阵字体通过像素化的正确获取

要在单片机内自由显示文字&#xff0c;必须准备相应的字库。之前也发文介绍过&#xff1a; 在esp32(esp8266) 提供软字库显示中文的解决方案_esp32中文字库-CSDN博客 包括已经开源的项目&#xff1a; https://github.com/StarCompute/tftziku 这种字体获取思路是&#xff1a…

HackTheBox - Medium - Linux - Agile

Agile Agile 是一个中等难度的 Linux 机器&#xff0c;在端口 80 上有一个密码管理网站。创建帐户并添加几个密码后&#xff0c;发现网站的导出到 CSV 功能容易受到任意文件读取的攻击。其他终结点的枚举显示“/download”在访问时引发错误&#xff0c;并显示“Werkzeug”调试…

Duboo-入门到学废【上篇】

目录 1&#x1f95e;.什么是duboo 2&#x1f32d;.架构图 3.&#x1f37f;快速入门 4.&#x1f9c7;浅浅理解 1.什么是duboo&#x1f936;&#x1f936;&#x1f936; Dubbo是一个由阿里巴巴开发的基于Java的开源RPC框架。它提供了高性能、透明化的远程方法调用&#xff0…