在使用二分搜索的时候,更新条件不总是相同,虽然说使用bS目的就是为了target,但也有如下几种情况:

  1. 求第一个=target的索引

  2. 求第一个>target的索引

  3. 求第一个>=target的索引

  4. 求最后一个=target的索引

  5. 求最后一个<target的索引

  6. 求最后一个<=target的索引

从这六种情况来看,其实可以分成两种搜索:左边界搜索->最小满足条件的索引右边界搜索->最大满足条件的索引。这么说可能有点抽象,看1-3种情况:都是求第一个符合查询条件的索引,也就是遇到符合条件的索引就返回,即最小索引;4-6种情况:求最后一个符合查询条件的索引,即最大的符合条件的索引即最大索引。

定义查询条件为check(nums[m])接下来分两种情况讨论:

  • 左边界问题:

    • 先给结论,左边界判断时,要一直收缩右侧以达到不断判断左侧数据是否符合查询条件的目的,因而当符合check条件的操作与nums[m]>t时操作相同,收缩r=m。之所以是r=m而不是r=m-1,是因为符合check条件时,此r也可能是解,所以不能跳过这个r。

    • 左边界通用代码

      int l=0,r=n-1;
      while(l<r){int m = l+(r-l)/2;if(check(m)) r = m;else l = m+1;
      }
      return l;
    • 求第一个=target的索引:

      • check为 nums[m] == target与nums[m]>target合并

      • while(l<r){int m = l+(r-l)/2;if(nums[m] >= target) r = m;else l = m+1;
        }
        return (nums[l] == target) ? l : -1;
    • 求第一个>target的索引:

      • check为nums[m] > target

      • while(l<r){int m = l+(r-l)/2;if(nums[m] > target) r = m;else l = m+1;
        }
        return l;
    • 求第一个>=target的索引:

      • check为nums[m]>=target

      • while(l<r){int m = l+(r-l)/2;if(nums[m] >= target) r = m;else l = m+1;
        }
        return l;
  • 右边界问题

    • 右边界问题要求的是最大的满足条件的索引,因而要收缩左侧以达到一直判断右侧数据是否能够符合查询条件的目的。因而当符合check条件的操作与nums[m]<t时操作相同,收缩l=m。之所以是l=m而不是l=m+1,是因为符合check条件时,此l也可能是解,所以不能跳过这个l。

    • 右边界涉及到一个m向上取整的问题,也就是m每次计算m = (l+r+1)/2;原因是,右边界搜索会令l=m,若m向下取整,接近临界条件时有可能导致m=(l+r)/2=l的情况,那么再次遇上收缩,l=m。如此循环导致搜索无法跳出。

    • 右边界搜索通用代码:

      int l=0,r=n-1;
      while(l<r){int m = (r+l+1)/2;if(check(m)) l = m;else r=m-1;
      }
    • 求最后一个=target的索引

      • check为 nums[m] == target归并到nums[m] < target中

      • while(l<r){int m = (l+r+1)/2;if(nums[m] <= target) l = m;else r = m-1;
        }
        return (nums[l] == target) ? l : -1;
    • 求最后一个<target的索引

      • check为nums[m] < target

      • while(l<r){int m = (l+r+1)/2;if(nums[m] < target) l = m;else r = m-1;
        }
        return l;
    • 求最后一个<=target的索引

      • check为nums[m]<=target

      • while(l<r){int m = (l+r+1)/2;if(nums[m] <= target) l = m;else r = m-1;
        }
        return l;
类型常见题号
第一个 == targetLC 34
最后一个 == targetLC 34
第一个 ≥ targetLC 35, LC 300, LC 378
最后一个 ≤ targetLC 34, LC 2080
第一个 > targetLC 875, LC 410, LC 1011
最后一个 < targetLC 74, LC 2300

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

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

相关文章

【springboot+vue3】博客论坛管理系统(源码+文档+调试+基础修改+答疑)

目录 一、整体目录&#xff1a; 项目包含源码、调试、修改教程、调试教程、讲解视频、开发文档&#xff08;项目摘要、前言、技术介绍、可行性分析、流程图、结构图、ER属性图、数据库表结构信息、功能介绍、测试致谢等约1万字&#xff09; 二、运行截图 三、代码部分&…

20250907_梳理异地备份每日自动巡检Python脚本逻辑流程+安装Python+PyCharm+配置自动运行

一、逻辑流程(autocheckbackup.py在做什么) 1.连接Linux服务器 用 paramiko 登录你配置的 Linux 服务器(10.1.3.15, 10.1.3.26),进入指定目录(如 /home, /backup/mes),递归列出文件。 采集到的信息:服务器IP、目录、数据库名称、文件名、大小、修改时间。 2.连接Wind…

terraform-state详解

一、Treeaform-state的作用 Terraform-state是指Terroform的状态&#xff0c;是terraform不可缺少的生命周期元素。本质上来讲&#xff0c;terraform状态是你的基础设施配置的元数据存储库&#xff0c;terraform会把它管理的资源状态保存在一个状态文件里。 默认情况下&#xf…

四、kubernetes 1.29 之 Pod 生命周期

一、概述当容器与 pause 容器共享网络&#xff08;Network&#xff09;、IPC&#xff08;进程间通信&#xff09;和 PID&#xff08;进程命名空间&#xff09;后&#xff0c;二者形成了一种紧密的 "共享命名空间" 关系&#xff0c;共同构成了 Kubernetes 中 "Po…

AI与环保:礼貌用语背后的能源挑战与解决方案

程序员的技术管理推荐阅读 窄化效应&#xff1a;程序员与管理者的隐形情绪陷阱 从“激励”到“保健”&#xff1a;80后与90后程序员&#xff0c;到底想要什么&#xff1f; 从“激励”到“保健”&#xff1a;80后与90后程序员&#xff0c;到底想要什么&#xff1f; 场景引入&…

OpenCV C++ 特征提取:从角点检测到对象识别

特征提取是计算机视觉的核心技术,通过识别图像中具有代表性的关键点及其描述信息,实现图像匹配、对象识别、姿态估计等高级任务。本章将系统讲解从基础的图像金字塔、角点检测,到复杂的 ORB 和 SIFT 特征提取与匹配,最终实现基于特征的对象检测完整流程。 一、图像金字塔 …

Codeforces Round 1049 (Div. 2) D题题解记录

大致题意&#xff1a;给定nnn个区间(li,ri)(l_i,r_i)(li​,ri​)。每次选取两个尚未被标记的区间(l1,r1)(l_1,r_1)(l1​,r1​)与(l2,r2)(l_2,r_2)(l2​,r2​)&#xff0c;使得他们均被标记&#xff0c;同时可以任选x∈[l1,r1]&#xff0c;y∈[l2,r2]x\in[l_1,r_1]&#xff0c;y…

《WINDOWS 环境下32位汇编语言程序设计》第15章 注册表和INI文件

15.1 注册表和INI文件简介在一个操作系统中&#xff0c;无论是操作系统本身还是运行于其中的大部分应用程序&#xff0c;都需要使用某种方式保存配置信息。在DOS系统中&#xff0c;配置信息往往是软件的开发者根据自己的喜好用各种途径加以保存的&#xff0c;比如在磁盘上面写一…

JDK 17、OpenJDK 17、Oracle JDK 17 的说明

Java生态系统的核心概念&#xff1a;简单来说&#xff1a;JDK 17 是一个标准规范&#xff0c;定义了Java开发工具包第17个长期支持版应该包含什么功能。openjdk-17-jdk 是一个具体的实现&#xff0c;是遵循上述规范、由OpenJDK社区提供的开源软件包。下面我们通过一个表格和详细…

手写MyBatis第58弹:如何优雅输出可执行的SQL语句--深入理解MyBatis日志机制:

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系

前言 在当今微服务架构盛行的时代&#xff0c;应用程序的监控变得尤为重要。Spring Boot 作为广泛使用的微服务框架&#xff0c;其监控需求也日益增加。Prometheus 和 Grafana 作为开源监控领域的佼佼者&#xff0c;为 Spring Boot 应用提供了强大的监控能力。本文将详细介绍如…

JS中的多线程——Web Worker

众所周知&#xff0c;JavaScript 是单线程运行的&#xff08;至于为什么是单线程可以看一下这篇文章——事件循环机制&#xff09;&#xff0c;当浏览器主线程被大量计算任务阻塞时&#xff0c;页面就会出现明显的卡顿现象。Web Worker 提供了在独立线程中运行 JavaScript 的能…

【SQL注入】延时盲注

sleep(n)​​: 核心延时函数。使数据库程序暂停 n秒。​​if(condition, true_expr, false_expr)​​: 条件判断函数。如果 condition为真&#xff0c;执行 true_expr&#xff0c;否则执行 false_expr。​​用于将延时与判断条件绑定​​。​​mid(a, b, c)​​: 字符串截取函数…

IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南

1. 功能概览 Java Stream Debugger 提供 Trace Current Stream Chain 功能&#xff0c;用来在调试时分析和可视化 Stream 操作链。 主要用途&#xff1a; 在运行时查看流操作链的每一步输出找出 map/filter 等操作的问题避免手动加 peek() 打印调试2. 使用入口 在 IDEA 2025.1 …

ARM-指令集全解析:从基础到高阶应用

一、ARM 指令集体系结构版本ARM 公司定义了多个指令集版本&#xff1a;ARMv1&#xff1a;原型机 ARM1&#xff0c;没有用于商业产品。ARMv2&#xff1a;扩展 V1&#xff0c;包含 32 位乘法指令和协处理器指令。ARMv3&#xff1a;第一个微处理器 ARM6 核心&#xff0c;支持 Cach…

第3讲 机器学习入门指南

近年来&#xff0c;随着企业和个人生成的数据量呈指数级增长&#xff0c;机器学习已成为日益重要的技术领域。从自动驾驶汽车到流媒体平台的个性化推荐&#xff0c;机器学习算法已广泛应用于各个场景。让我们深入解析机器学习的核心要义。3.1 机器学习定义机器学习是人工智能的…

深入理解跳表:多层索引加速查找的经典实现

跳表&#xff08;Skip List&#xff09;是一种多层有序链表结构&#xff0c;通过引入多级索引加速查找&#xff0c;其核心设计类似于“立体高速公路系统”&#xff0c;底层是原始链表&#xff0c;上面有各种高度的"高架桥"。 高层道路跨度大&#xff0c;连接远方节点…

Flutter 视频播放器——flick_video_player 介绍与使用

在移动端应用中&#xff0c;视频播放是一个常见的功能场景&#xff0c;例如短视频、直播、课程、广告展示等。 Flutter 本身并没有直接提供视频播放器组件&#xff0c;而是依赖第三方库来实现。 今天要介绍的库是 flick_video_player&#xff0c;它基于 video_player 封装&…

编写cmakelists文件常用语句

cmake_minimum_required (VERSION 3.10) 指定最小版本project(XXXX) 指定项目名字 ---------------set(MAIN_EXEC_NAME dwarf_parser) 定义变量${ MAIN_EXEC_NAME } 变量取值set(CMAKE_CXX_STANDARD 14) 指定c14标准&#xff0c;还有11、17、20等标准…

麒麟桌面系统找不到mbr启动,并重新安装grub

根据你提供的情况,“麒麟桌面系统找不到MBR启动”,这通常是由于GRUB引导损坏、MBR记录丢失或分区表异常导致的。你可以按照以下步骤重新安装GRUB并修复MBR启动: ✅ 步骤一:准备工具 使用银河麒麟LiveCD或U盘启动盘(可用Ventoy制作); 启动电脑,选择从U盘或光盘进入Live环…