二分查找专题(总)

news2024/11/24 3:10:44

1、经典二分查找模板

int search(vector<int>& nums, int target) {

        int right = nums.size() - 1;
        int left = 0;

        while(left < right)
        {
            int mid = (left + right)/2;
            if(nums[mid] > target)
            {
                right = mid-1;
            }
            else if(nums[mid] < target)
            {
                left = mid+1;
            }
            else 
            {
                return mid;
            }
        }

        if(right == left && nums[right] == target)
        {
            return right;
        }

        return -1;

    }

通过不断更新左右左右边界,找到目标值。

细节问题:

1、每次更新都更新到 mid+1 或 mid-1位置。

2、循环结束条件为 left < right。

3、循环结束需要额外判断。

4、防止数组求取mid时值溢出可选用 left + (right - left)/2 ;

2、目标值小于等于右区间的模板

        int left = 0;
        int right = nums.size() - 1;

        int resleft = 0;
        int resright = 0;

        while(left < right)
        {
            int mid = left + (right-left)/2;
            if(nums[mid] >= target)
            {
                right = mid;
            }
            else 
            {
                left = mid+1;
            }
        }

如图所示:绿色部分为目标值不存在的区间,红色部分为目标值可能存在的区间。

与经典二分算法不同的是:

当mid位置命中绿色部分时:left = mid + 1;

当mid位置命中红色位置时:right = mid;;

并且求取mid时遇到数组的size为偶数时,想要mid 靠左则使用 left = (right - left )/2;,想靠右使用 right = ( right - left + 1)/2 ;

此时要用left = (right - left )/2。

同样,结束循环时要判断。

3、目标值大于等于左区间的模板

while(left < right)
        {
            int mid = left + (right+1-left)/2;
            if(nums[mid] <= target)
            {
                left = mid;
            }
            else 
            {
                right = mid - 1;
            }
        }

如图所示:绿色部分为目标值不存在的区间,红色部分为目标值可能存在的区间。

与经典二分算法不同的是:

当mid位置命中绿色部分时:right = mid - 1;

当mid位置命中红色位置时:left = mid;;

并且求取mid时遇到数组的size为偶数时,想要mid 靠左则使用 left = (right - left )/2;,想靠右使用 right = ( right - left + 1)/2 ;

此时要用( right - left + 1)/2

同样,结束循环时要判断。

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

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

相关文章

c语言-经典例题

C语言-经典例题 一、单项选择题 1、 -- A 2、 -- C y<5 --是关系运算符的优先级大于&& -- 是逻辑运算符 3、 -- B - D选项&#xff1a;c是float类型&#xff0c;所以c/2是1.5 4、 -- C 从后往前执行&#xff08;先算后面的&a…

【uniapp】vue3+vite配置tailwindcss

安装 npm install autoprefixer tailwindcss uni-helper/vite-plugin-uni-tailwind -Dautoprefixer &#xff1a;自动管理浏览器前缀的插件&#xff0c;可以解析css文件并且添加前缀到css内容里。uni-helper/vite-plugin-uni-tailwind: 将 Tailwind CSS 框架集成到使用 Vite 作…

linux系统编程:多任务编程(进程1)

1.进程 进程:(进行中的程序)--正在运行的程序 (动态的) ---内存 程序的一次执行过程&#xff01; 一个程序一个程序 可以 对应多个进程 程序 -- a.out (可执行程序) ---静态的 程序 加载 到内存 运行起来 成为了 进程。 进程是 程序运行的实体。 程序 数据代码 2.进…

背包九讲(求方案数,求具体方案数,有依赖背包)

文章目录 求方案数基本思路代码 背包问题求具体方案基本思路代码 有依赖背包基本思路代码 求方案数 问题描述&#xff1a; 给定n nn个物品&#xff0c;以及一个容量大小为m mm的背包&#xff0c;然后给出n nn个物品的体积及价值&#xff0c;求背包最大价值是多少&#xff0c;也…

递归排序 归并排序 快排

递归 求中点 midL(R-L)/2 midL((R-L)>>1)右移一位更快 子问题等量 mast er公式 T(N) a*T(N/b)O(N^d) T(N):母 T(N/b)&#xff1a;子 &#xff08;是否等量&#xff09; a&#xff1a;调用多少次 O(N^d)&#xff1a;除去子变量之外的时间复杂度 子问题等量 上面…

sqli-labs-master靶场通关

目录 一、sqli-labs第一关 1.判断是否存在sql注入 &#xff08;1&#xff09;提示输入数字值的ID作为参数&#xff0c;输入?id1 &#xff08;2&#xff09;通过数字值不同返回的内容也不同&#xff0c;所以我们输入的内容是带入到数据库里面查询了 &#xff08;3&#xff0…

信号量和管道

一、信号量 实现模拟售票问题&#xff1a; 1、信号量的机制&#xff1a;描述可使用资源的个数。 &#xff08;1&#xff09;P操作&#xff1a;表示使用这个资源&#xff0c;资源个数减一 逻辑&#xff1a;尝试获取资源——有资源可用直接使用 | 无资源可用等待 如果信号量的…

面向新人的 Java 面试问题(101-150)

101.什么是多态&#xff1f; 多态性被定义为能够采用多种形式的能力。它有两种类型&#xff0c;即编译时多态性或方法重载 - 在编译时调用的函数。例如&#xff0c;以“面积”类为例。根据参数数量&#xff0c;它可以计算正方形、三角形或圆形的面积。运行时多态性或方法覆盖 …

【详细】linux 打包QT程序

【详细】linux 打包QT程序 一. 安装linuxdeployqt1.1 下载linuxdeployqt源码并修改如下 二. 安装patchelf三. 打包appimage四. 打包成 Debian包4.1 control文件内容4.2 postinst文件内容4.3 postrm文件内容4.4 打包命令4.4 安装命令4.5 卸载命令 一. 安装linuxdeployqt 下载地…

【Redis】Redis 数据类型与结构—(二)

Redis 数据类型与结构 一、值的数据类型二、键值对数据结构三、集合数据操作效率 一、值的数据类型 Redis “快”取决于两方面&#xff0c;一方面&#xff0c;它是内存数据库&#xff0c;另一方面&#xff0c;则是高效的数据结构。 Redis 键值对中值的数据类型&#xff0c;也…

被极氪“背刺”新能源汽车车主,你可以说不

文 魏强 导语&#xff1a;谁也改变不了不断被“背刺”的命运。 8月13日晚&#xff0c;极氪召开发布会主推两款改款车——2025款极氪007升级了第二代金砖电池&#xff08;磷酸铁锂&#xff09;、标配了激光雷达和两颗Orin X芯片、全系降价2-3万元。2025款极氪001智驾芯片从Mob…

Artifactory集成LDAP示例

LDAP在企业软件身份认证中起到了非常关键的作用&#xff0c;给企业内用户带来了非常多的便利&#xff0c;JFrog 平台支持针对开箱即用的 LDAP 服务器对用户进行身份验证。下面我们一起看下Artifactory如何集成LDAP&#xff0c;本示例以OpenLDAP为例。 1.快速安装OpenLDAP doc…

SqlSugar详解-国产ORM框架

ORM (Object-Relational Mapping) 概念 ORM 是一种程序技术&#xff0c;用于将关系型数据库中的数据映射到对象上。 主要目的是简化数据库操作&#xff0c;使得开发人员可以像操作对象一样来操作数据库。 原理 数据表与类的映射&#xff1a;数据库中的表对应为类。 记录与对象…

灵办AI助手Chrome插件全面评测:PC Web端的智能办公利器

探索灵办AI助手在Mac OS上的高效表现&#xff0c;支持多款主流浏览器&#xff0c;助你轻松应对办公挑战 文章目录 探索灵办AI助手在Mac OS上的高效表现&#xff0c;支持多款主流浏览器&#xff0c;助你轻松应对办公挑战摘要引言开发环境介绍核心功能评测1. 网页翻译与双语对照 …

【祖孙询问】

问题 代码 #include <bits/stdc.h> using namespace std; const int N 4e410; vector<int> edge[N]; int p[N][20], d[N]; void dfs(int from, int u) {for(auto to : edge[u]){if(to from) continue;d[to] d[u] 1;p[to][0] u;dfs(u, to);}} void init() {fo…

mysql主从同步遇到的问题

1&#xff0c;主库data文件复制到从库&#xff0c;之后主库要同步的实例data一定不要在修改&#xff1b; 1.1&#xff0c;修改之后就要重新覆盖一遍 2&#xff0c;如果状态不对&#xff1a;一定要查看日志&#xff1b;比如slave_io_state是空时&#xff0c;需要查看日志 2.1&a…

使用百度文心智能体创建AI旅游助手

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…

查看电脑连接过的wifi密码

netsh wlan show profiles netsh wlan show profile name"8821" keyclear

用Python实现9大回归算法详解——01. 线形回归算法

1. 线性回归的基本概念 线性回归是一种最基本的监督学习算法&#xff0c;用于预测因变量&#xff08;目标变量&#xff09;和一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。线性回归假设因变量与自变量之间的关系是线性的&#xff0c;即可以用以下形式的线性方…

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…