二分算法及其公式

二分查找

  • 二分查找是大多数人第一个接触到的算法,很多人都认为只有有序的数组可以使用二分查找,但这种思想其实是错误的,二分查找是可以用于拥有二段性的数组,而且二分算法是由模板做参考的,所以只要掌握就可以解决大多二分查找的问题

题目

请添加图片描述

class Solution {
public://二分查找算法不一定是要使用严格的升序或者降序,只要区间可以划分为二段性就可以使用vector<int> searchRange(vector<int>& nums, int target) {//其实可以分别寻找第一个位置和最后一个位置int left = 0, right = nums.size()-1, sz = nums.size(), mid = 0;vector<int> ret;//寻找左边界while(left <= right){mid = left + (right-left+1)/2;if(nums[mid] == target && (mid == 0 || nums[mid-1] != target)){ret.emplace_back(mid);break;}if(nums[mid] > target || nums[mid] == target) right = mid-1;if(nums[mid] < target) left = mid+1;}//寻找右边界left = mid, right = nums.size()-1;while(left <= right){mid = left + (right-left+1)/2;if(nums[mid] == target && (mid == sz-1 || nums[mid+1] != target)){ret.emplace_back(mid);break;}if(nums[mid] > target) right = mid-1;if(nums[mid] < target || nums[mid] == target) left = mid+1;}if(ret.empty()){return {-1,-1};}return ret;}
};

​ 这是我最开始写的代码,最开始其实我不屑于看什么模板,感觉这些用if else 语句都可以解决,但多做了几道发现if else语句会让你的代码变得非常的臃肿,而且有一种面向测试用例编程的感觉,所以在在这里我想斗胆给各位好好讲一下二分查找算法

查找左端点

请添加图片描述

  • 首先,这里我们将区间分为小于和大于等于,这样二段性就出来了,你可能会问,为什么不划分为小于等于和大于这两个区间,因为我们查找的是左端点,划分为小于等于和大于还怎么找左端点

算法原理

  1. x  < t(target) left = mid +1 (这里可以=mid+1因为左区间划分是小于,所以最终结果一定不在左区间,所以left = mid + 1)1. x >= t  right = mid (这里不可以是 right = mid-1)因为如果right = mid-1的话很可能会出现right超出区间的情况,这样就会导致没法判断到结果

细节处理

  • 循环条件:

    • left < right

    为什么不是left <= right,大家可以看下图,如果此时ret > target这是就会执行第二种语句,right=mid,那就会造成死循环

请添加图片描述

  • 找中点的操作

    mid = left + (right-left)/2 这种情况是如果只有两个元素会找左边的那一个

    为什么不是 mid = left + (right-left+1)/2

    大家看下图如果是找右边的且nums[right]>=t那不是又会出现死循环吗。

请添加图片描述

寻找右端点

  • 这里的基本操作都是一样的,出了找中点还有算法(left与right的移动)不一样,所以不多赘述,各位可以自行画图处理,下面给大家一个模板,大家可以参考。

请添加图片描述

完整代码

class Solution {
public://二分查找算法不一定是要使用严格的升序或者降序,只要区间可以划分为二段性就可以使用vector<int> searchRange(vector<int>& nums, int target) {if(nums.empty()) return{-1, -1};//其实可以分别寻找第一个位置和最后一个位置int left = 0, right = nums.size()-1, sz = nums.size(), mid = 0, begin = 0;//寻找左边界while(left < right){mid = left + (right-left)/2;if(nums[mid] >= target) right = mid;if(nums[mid] < target) left = mid+1;}//判断if(nums[left] != target) return {-1, -1};begin = left;//寻找右边界right = nums.size()-1;while(left < right){mid = left + (right-left+1)/2;if(nums[mid] > target) right = mid-1;if(nums[mid] <= target) left = mid;}return {begin, right};}
};

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

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

相关文章

机器学习课程学习周报六

机器学习课程学习周报六 文章目录 机器学习课程学习周报六摘要Abstract一、机器学习部分1.1 循环神经网络概述1.2 循环神经网络架构1.2.1 深层循环神经网络1.2.2 Elman网络和Jordan网络1.2.3 双向循环神经网络 1.3 长短期记忆网络1.4 LSTM原理1.5 RNN的学习方式1.6 RNN中的梯度…

BUG解决(vue3+echart报错):Cannot read properties of undefined (reading ‘type‘)

这是 vue3echart5 遇到的报错&#xff1a;Cannot read properties of undefined (reading ‘type‘) 这个问题需要搞清楚两个关键方法&#xff1a; toRaw&#xff1a; 作用&#xff1a;将一个由reactive生成的响应式对象转为普通对象。 使用场景&#xff1a; 用于读取响应式…

word修改一处全文都变了

在word中修改一处文字&#xff0c;全文都变了&#xff0c;还得重新排版。来来回回、反反复复特别麻烦。主要是因为word的文档用WPS打开&#xff0c;WPS自动做了更改。我们将word中的文字的样式取消自动更新就可以了。 右键“正文1”&#xff0c;选择“修改” 将子等更新的√&am…

我当年自学黑客(网络安全)的一些心得!(内附学习笔记)

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a;1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01;&#xff08;文末有福利&#xff01;&…

什么是网络安全等级保护测评服务?

等保测评 依据国家网络安全等级保护制度规定&#xff0c;按照有关管理规范和技术标准&#xff0c;对非涉及国家秘密的网络安全等级保护状况进行检测评估。定级协助 根据等级保护对象在国家安全、经济建设、社会生活中的重要程度&#xff0c;以及一旦遭到破坏、丧失功能或者数据…

那英夺冠,《歌手2024》爆大瓜之王!

《歌手2024》真是今年的大瓜之王&#xff0c;瓜农们都要发奖金了&#xff01; 节目组邀请过小沈阳参演&#xff0c;却被他婉拒&#xff0c;难道他预判了《歌手2024》的预判。 决赛颁奖现场上&#xff0c;刘欢提前离场&#xff0c;那英凭着极不稳定的发挥&#xff0c;硬是夺下…

大厂linux面试题攻略四之Linux网络服务(二)

五、Linux网络服务-Apache优化 1.请写出工作中常见的Apache优化策略 Apache服务器优化是提升网站响应速度和稳定性的重要手段。在工作中&#xff0c;常见的Apache优化策略包括以下几个方面&#xff1a; 1. 启用压缩技术 Gzip压缩&#xff1a;使用Gzip压缩技术可以减少服务器…

OAK相机扩展NDVI功能检测植物健康情况

什么是NDVI&#xff1f; 首先&#xff0c;NDVI代表归一化差异植被指数。这听起来很花哨&#xff0c;但这实际上只是衡量植物健康的一种高级方法。NDVI摄像机使用可见光和近红外 (NIR) 光捕获图像。健康的植物反射更多的近红外光并吸收更多的可见光&#xff0c;而生病的植物反射…

MSA+抑郁症模型总结(三)(论文复现)

MSA抑郁症模型总结&#xff08;三&#xff09;&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 MSA抑郁症模型总结&#xff08;三&#xff09;&#xff08;论文复现&#xff09;热门研究领域&#xff1a;情感计算的横向发展一、概述二、论…

卷积神经网络(六)---实现 cifar10 分类

cifar10 数据集有60000张图片&#xff0c;每张图片的大小都是 32x32 的三通道的彩色图&#xff0c;一共是10种类别、每种类别有6000张图片&#xff0c;如图4.27所示。 图 4.27 cifar数据集 使用前面讲过的残差结构来处理 cifar10 数据集&#xff0c;可以实现比较高的准确率。 …

springboot在线图库网站-计算机毕业设计源码35597

摘 要 本文基于Spring Boot作为后端框架&#xff0c;Vue作为前端框架&#xff0c;设计并实现了一个功能丰富的在线图库网站。该网站提供了注册、登录、普通用户功能和管理员功能等一系列功能&#xff0c;为用户提供了方便的浏览摄影相关内容和参与活动的途径&#xff0c;同时管…

《从零开始做个摸鱼小网站! · 序》灵感来源

序 大家好呀&#xff0c;我是summo&#xff0c;这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛&#xff0c;2核2G的云服务器一年只要99块钱&#xff0c;懂行的人应该知道这个价格在业界已经是非常良心了&#xff0c;虽然优惠只有一年&a…

java之学生管理系统优化版本(利用final)

final的意思表示最终的: 被final 修饰的变量叫做常量,而常量的意思就是不可修改的量,也不可以赋值. 被final修饰的方法叫做最终方法,别的类不可以调用. 被fianl修饰的类叫做最终类,别的类不可调用,也不能作为父类继承.public class StudentSysterm {private static final Strin…

【通俗理解】自由能与自由意志的桥梁——从物理到哲学的跨越

【通俗理解】自由能与自由意志的桥梁——从物理到哲学的跨越 自由能与自由意志的类比 你可以把自由能比作一个“能量货币”&#xff0c;它代表着系统能够用来做功的能量。而自由意志则是一个“选择的能力”&#xff0c;它代表着个体在做出决策时的自主性和可能性。 自由能与自由…

校园气象观测站

TH-XQ3校园气象观测站是一种用于进行校园内天气观测和气象数据收集的设施。它通常由一系列的气象仪器和设备组成&#xff0c;包括气温、湿度、风速、风向、气压、降水量等传感器。观测站可以实时监测和记录天气变化&#xff0c;提供有关天气现象和气象数据的信息。 校园气象观…

第09课 Scratch入门篇:小鸡啄米-自制积木实现

小鸡啄米-自制积木 故事背景&#xff1a; 在上一章的案例中&#xff0c;实现了小鸡啄米的动画&#xff0c;但是发现太多的重复代码&#xff0c;是我们编程的时候代码泰国繁琐&#xff0c;我们可以使用自制积木&#xff0c;将相同的代码提取出来制作成一个新的积木&#xff0c;在…

计算机网络-七层协议栈介绍

之前介绍了网络世界的构成&#xff0c;从宏观角度介绍了网络设备和网络架构&#xff0c;链接: link&#xff0c;但是这种认识过于粗糙&#xff0c;过于肤浅。网络本质上是用于主机之间的通信&#xff0c;是端对端的连接通信&#xff0c;两台计算机可能距离很远&#xff0c;主机…

IOday3

一、思维导图 二、模拟面试 结构体中一个char&#xff0c;一个int 结构体占字节长度是多少&#xff1f;描述一下结构体字节对齐规则&#xff1f;怎样改成两字节对其&#xff1f; 答&#xff1a; 8字节&#xff1b; 结构体中每个变量自己先要符合字节对齐原则…

MVC三层框架

什么是MVC &#xff1a; Model模型 view视图 Controller控制器 早先架构&#xff1a; 用户直接访问控制层&#xff0c;控制层就可以直接操作数据库 弊端&#xff1a;程序十分臃肿&#xff0c;不利于维护 servlet的代码中&#xff1a;处理请求、响应、视图跳转、处理JDBC、处理…

【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图

从0制作自己的ros导航小车 前言一、激光雷达数据发布二、激光雷达数据、小车模型、里程计数据同时显示三、键盘控制小车运动四、使用gmapping建图五、地图保存 系列文章&#xff1a; ①【从0制作自己的ros导航小车&#xff1a;介绍及准备】 ②【从0制作自己的ros导航小车&#…