二分查找法

使用二分查找法的前提:(1)数组为有序数组.

                                        (2)数组中无重复元素.

二分的两种写法:

方法一:[left,right]

class Solution {
public:int search(vector<int>& nums, int target) {int left=0;int right=nums.size()-1;while (left <= right){int mid=(left+right)/2;if(nums[mid]>target)right=mid-1;else if(nums[mid]<target)left=mid+1;elsereturn mid;}return -1;}
};

方法二:[left,rigght)

class Solution {
public:int search(vector<int>& nums, int target) {int left=0;int right=nums.size()-1;while (left <=right){int mid=(left+right)/2;if(nums[mid]>target)right=mid;else if(nums[mid]<target)left=mid+1;elsereturn mid;}return -1;}
};

核心代码(递归)

int binsearch(int left,int right)

        {

                if(left<=right)

                        {

                            int mid=(left+right)/2;

                            if(nums[mid]==target)

                            return mid;

                            if(nums[mid]>target)

                            return binsearch(left,mid-1);

                            if(nums[mid]<target)

                            return binsearch(mid+1,right);

                        }

                    return 0;

        }

核心代码(循环)

int f=-1;

while(left<=right)

{

        int mid=(left+right)/2;

        if(nums[mid]==target)

        {

                f=mid;

                break;

        }

        if(target<nums[mid])

        right=mid-1;

        if(target>nums[mid])

        left=mid+1

}

        if(f==-1)

        cout<<"没找到";

         else

         cout<<f<<endl;

以下是力扣二分法题目的常见解题思路:
 

704. 二分查找
 
- 初始化左右指针 left 和 right ,分别指向数组两端。
- 在 left <= right 的循环中,计算中间索引 mid 。
- 比较 nums[mid] 与 target ,若相等则返回 mid ;若 nums[mid] > target ,则更新 right = mid - 1 ;若 nums[mid] < target ,则更新 left = mid + 1 。
- 循环结束未找到则返回-1。
 
35. 搜索插入位置
 
- 同样以 left 和 right 初始化数组两端。
- 循环条件为 left <= right ,计算 mid 后,若 nums[mid] >= target ,则 right = mid - 1 ,否则 left = mid + 1 。
- 循环结束后, left 所指位置就是目标值应插入的位置。
 
34. 在排序数组中查找元素的第一个和最后一个位置
 
- 先通过二分法找目标值第一个位置,当 nums[mid] >= target 时,更新 right = mid ,循环结束后 left 可能是第一个位置,需再判断 nums[left] 是否为 target 。
- 找最后一个位置时,当 nums[mid] <= target 时,更新 left = mid ,循环结束后,若 nums[right] 是 target , right 就是最后一个位置。
 
69. x的平方根
 
- 令 left = 0 , right = x ,在 left <= right 循环中计算 mid 。
- 若 mid * mid <= x && (mid + 1) * (mid + 1) > x ,则 mid 就是所求平方根;若 mid * mid > x ,更新 right = mid - 1 ;否则更新 left = mid + 1 。
 
367. 有效的完全平方数
 
- 类似求平方根, left 设为1, right 设为 num 。
- 循环中计算 mid ,若 mid * mid == num ,则返回 true ;若 mid * mid > num ,更新 right = mid - 1 ,否则更新 left = mid + 1 。循环结束未找到则返回 false 。
 
162. 寻找峰值
 
- 初始化 left = 0 , right = nums.length - 1 。
- 当 left < right 时,计算 mid ,若 nums[mid] > nums[mid + 1] ,说明峰值在左半部分,更新 right = mid ;否则峰值在右半部分,更新 left = mid + 1 。
- 循环结束后, left 指向的就是一个峰值位置。

判断 right 应赋值为 mid 还是 mid - 1 

关键在于二分查找的目标以及当前中间值与目标值的关系,具体可从以下几方面判断:
 
- 查找精确值且数组元素唯一:当目标是在有序数组中查找某个精确值,且数组元素唯一时,若 nums[mid] > target ,说明目标值在左半部分,此时应将 right 赋值为 mid - 1 。因为 nums[mid] 已经大于 target ,它不可能是目标值,所以下一轮查找范围应不包含 mid ,如704. 二分查找就是这种情况。
 
- 查找左边界或最大不超过目标值的元素:若要查找目标值在数组中的左边界,或者是查找数组中最大的、不超过目标值的元素时,当 nums[mid] >= target ,应将 right 赋值为 mid 。这是为了让查找范围继续向左侧收缩,且保留 mid 位置,因为 mid 位置有可能就是左边界,或者是符合条件的最大元素,如35. 搜索插入位置、34. 查找元素第一个位置就需这样处理。
 
- 查找右边界或最小超过目标值的元素:当任务是查找目标值的右边界,或者是要找到数组中最小的、超过目标值的元素时,若 nums[mid] <= target ,则应将 right 赋值为 mid - 1 。这样能使查找范围向右收缩,同时排除 mid 位置,因为 mid 位置及左侧元素已不满足“右边界”或“最小超过目标值”的条件,例如34. 查找元素最后一个位置时就遵循此规则。

二分法是一种通过不断将区间一分为二,逐步逼近目标值的算法方法,适用于以下几类题型:


-方程求解类:用于求解方程f(x)=0的根。若函数f(x)在区间[a,b]上连续,且f(a)\cdot f(b)<0,则可利用二分法在该区间内寻找方程的根。如求解方程x^3 - 2x - 1 = 0在区间[1,2]内的根。
 
- 函数最值类:当函数f(x)在某区间上具有单调性,且已知最值所在的大致区间时,可通过二分法来逼近最值。例如,求函数f(x)=x^2 - 4x + 3在区间[0,3]上的最小值,可利用二分法不断缩小包含最小值的区间。
 
- 数据查找类:常用于在有序数组中查找特定元素。如在一个按升序排列的整数数组 [1, 3, 5, 7, 9, 11] 中查找数字7,可使用二分法,每次将数组分成两部分,确定目标元素在左半部分还是右半部分,逐步缩小查找范围。
 
- 参数确定类:一些问题中需要确定某个参数的取值,使得某个条件成立。若该条件与参数之间存在单调关系,可借助二分法确定参数值。比如,在物理实验中,要确定一个电阻值,使得电路中的电流满足某个范围,已知电流与电阻成反比例关系,就可通过二分法来尝试不同电阻值,找到符合条件的电阻。
 
- 最优解搜索类:在一些组合优化问题中,若目标函数具有单调性或满足一定的条件,可利用二分法搜索最优解。如背包问题中,已知背包容量和物品重量价值,二分查找能装入背包的最大价值对应的重量限制,进而求解最优装包方案。

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

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

相关文章

HarmonyOS:页面滚动时标题悬浮、背景渐变

一、需求场景 进入到app首页或者分页列表首页时&#xff0c;随着页面滚动&#xff0c;分类tab要求固定悬浮在顶部。进入到app首页、者分页列表首页、商品详情页时&#xff0c;页面滚动时&#xff0c;顶部导航栏&#xff08;菜单、标题&#xff09;背景渐变。 二、相关技术知识点…

鲲鹏+昇腾部署集群管理软件GPUStack,两台服务器搭建双节点集群【实战详细踩坑篇】

前期说明 配置&#xff1a;2台鲲鹏32C2 2Atlas300I duo&#xff0c;之前看网上文档&#xff0c;目前GPUstack只支持910B芯片&#xff0c;想尝试一下能不能310P也部署试试&#xff0c;毕竟华为的集群软件要收费。 系统&#xff1a;openEuler22.03-LTS 驱动&#xff1a;24.1.rc…

React中 点击事件写法 的注意(this、箭头函数)

目录 ‌1、错误写法‌&#xff1a;onClick{this.acceptAlls()} ‌2、正确写法‌&#xff1a;onClick{this.acceptAlls}&#xff08;不带括号&#xff09; 总结 方案1&#xff1a;构造函数绑定 方案2&#xff1a;箭头函数包装方法&#xff08;更简洁&#xff09; 方案3&am…

【路由交换方向IE认证】BGP选路原则之Weight属性

文章目录 一、路由器BGP路由的处理过程控制平面和转发平面选路工具 二、BGP的选路顺序选路的前提选路顺序 三、Wight属性选路原则规则9与规则11的潜移默化使用Weight值进行选路直接更改Weight值进行选路配合使用route-map进行选路 四、BGP邻居建立配置 一、路由器BGP路由的处理…

Missashe考研日记-day20

Missashe考研日记-day20 1 高数 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天当然是刷题啦&#xff0c;做不等式的证明板块的真题&#xff0c;证明题懂的都懂&#xff0c;难起来是真的一点思路都没有&#xff0c;这个板块还没做完&#xff0c;做完再总结题型。 2…

了解JVM

一.JVM概述 1.JVM的作用 把字节码编译为机器码去执行,负责把字节码装载到虚拟机中 现在的 JVM 不仅可以执行 java 字节码文件,还可以执行其他语言编译后的字节码文件,是一个跨语言平台 2.JVM的组成部分 类加载器&#xff08;ClassLoader&#xff09;运行时数据区&#x…

LeetCode LCR157 套餐内商品的排列顺序

生成字符串的全部排列&#xff08;去重&#xff09;&#xff1a;从问题到解决方案的完整解析 问题背景 在编程和算法设计中&#xff0c;生成字符串的所有排列是一个经典问题。它不仅出现在算法竞赛中&#xff0c;也在实际开发中有着广泛的应用&#xff0c;比如生成所有可能的…

pgsql:关联查询union(并集)、except(差集)、intersect(交集)

pgsql:关联查询union(并集)、except(差集)、intersect(交集)_pgsql except-CSDN博客

微信小程序中使用ECharts 并且动态设置数据

项目下载地址 GitHub 地址 https://github.com/ecomfe/echarts-for-weixin 将当前文件夹里的内容拷贝到项目中 目录&#xff1a; json: {"usingComponents": {"ec-canvas": "../components/ec-canvas/ec-canvas"} }wxml&#xff1a; <ec…

RV1126 人脸识别门禁系统解决方案

1. 方案简介 本方案为类人脸门禁机的产品级解决方案,已为用户构建一个带调度框架的UI应用工程;准备好我司的easyeai-api链接调用;准备好UI的开发环境。具备低模块耦合度的特点。其目的在于方便用户快速拓展自定义的业务功能模块,以及快速更换UI皮肤。 2. 快速上手 2.1 开…

深度学习ResNet模型提取影响特征

大家好&#xff0c;我是带我去滑雪&#xff01; 影像组学作为近年来医学影像分析领域的重要研究方向&#xff0c;致力于通过从医学图像中高通量提取大量定量特征&#xff0c;以辅助疾病诊断、分型、预后评估及治疗反应预测。这些影像特征涵盖了形状、纹理、灰度统计及波形变换等…

DeepSeek 接入 Word 完整教程

一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台&#xff1a; 打开浏览器&#xff0c;访问 DeepSeek 官方网站&#xff08;或您使用的相应平台&#xff09;。注册并登录您的账户。 创建 API 密钥&#xff1a; 在用户控制面板中&#xff0c;找到“API Keys”或“API…

驱动开发硬核特训 · Day 7:深入掌握 Linux 驱动资源管理机制(Resource Management)

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 总线驱动模型实战全解析 —— 以 PCA9450 PMIC 为例 敬请关注&#xff0c;记得标为原始粉丝。 &#x1f6a9; 在 Linux 驱动开发中&#xff0c;资源管理机制决定了驱动的稳定性与可靠性…

什么是TensorFlow?

TensorFlow 是由 Google Brain 团队开发的开源机器学习框架&#xff0c;被广泛应用于深度学习和人工智能领域。它的基本概念包括&#xff1a; 1. 张量&#xff08;Tensor&#xff09;&#xff1a;在 TensorFlow 中&#xff0c;数据以张量的形式进行处理。张量是多维数组的泛化…

【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)

文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…

《Vue Router实战教程》20.路由懒加载

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 路由懒加载 当打包构建应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&am…

docker 多主机容器组网

一、服务器A 1、初始化Swarm集群&#xff08;管理节点&#xff09; docker swarm init --advertise-addr 主节点ip 2、获取工作节点​​加入Swarm集群所需的Token 和完整命令 docker swarm join-token worker 3、创建Overlay网络 docker network create -d overlay --subnet…

rancher 解决拉取dashboard-shell镜像失败的问题

问题背景 在 Kubernetes 集群中部署 Rancher 后&#xff0c;点击右上角的 "Shell" 按钮时&#xff0c;Rancher 会动态创建一个 dashboard-shell-xxxxx Pod&#xff0c;用于提供 Web 终端功能。然而&#xff0c;由于默认镜像 rancher/shell:v0.1.21 托管在 Docker Hu…

OpenCV day2

Matplotlib相关知识 Matplotlib相关操作&#xff1a; import numpy as np from matplotlib import pyplot as pltx np.linspace(0, 2 * np.pi, 100) y1 np.sin(x) y2 np.cos(x)# 使用红色虚线&#xff0c;圆点标记&#xff0c;线宽1.5&#xff0c;标记大小为6绘制sin plt.p…

【网络安全】通过 JS 寻找接口实现权限突破

未经许可,不得转载。 本文所述所有风险点均已修复。 文章目录 引言正文引言 以下些漏洞已被起亚方面修复;起亚方面确认,这些漏洞从未被恶意利用过。 2024年6月11日,我们发现起亚汽车存在一系列严重安全漏洞,攻击者仅凭车牌号即可远程控制车辆的核心功能。该攻击不需要接触…