数据结构中的二分查找(折半查找)

news2024/11/20 3:30:58

二分法:顾名思义,把问题一分为2的处理,是一种常见的搜索算法,用于在有序数组或这有序列表中查找指定元素的位置,它的思想是将待搜索的区间不断二分,然后比较目标值与中间元素的大小关系,然后确定下一步的搜索的方向

以下是二分法的基本步骤:
确定搜索区间的起始位置 left 和结束位置 right,通常初始时 left 为数组的第一个元素的索引,right 为数组的最后一个元素的索引。
在每一次循环中,计算中间位置 mid,即 mid = (left + right) / 2。
比较目标值与中间元素的大小关系:
如果目标值等于中间元素,则找到了目标值,返回中间元素的索引。
如果目标值小于中间元素,则目标值可能在左半部分,更新 right = mid - 1。
如果目标值大于中间元素,则目标值可能在右半部分,更新 left = mid + 1。
重复步骤 2-3,直到找到目标值或搜索区间为空(即 left > right)。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路

标签:二分查找
过程:
设定左右指针
找出中间位置,并判断该位置值是否等于 target
nums[mid] == target 则返回该位置下标
nums[mid] > target 则右侧指针移到中间
nums[mid] < target 则左侧指针移到中间
时间复杂度:O(logN)

 c++代码实现

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-left)/2;
       if(nums[mid]==target){
           return mid;
       }
       else if(nums[mid]<target){
           left=mid+1;
       }
       else
       right=mid-1;
   }
   return -1;

    }
};

 c语言写法

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

 用递归来做

int binarySearchRecursive(int* nums, int left, int right, int target) {
    if (left > right) {
        return -1; // 搜索区间为空,未找到目标值
    }

    int mid = left + (right - left) / 2;

    if (nums[mid] == target) {
        return mid; // 找到目标值,返回索引
    } else if (nums[mid] < target) {
        return binarySearchRecursive(nums, mid + 1, right, target); // 目标值可能在右半部分
    } else {
        return binarySearchRecursive(nums, left, mid - 1, target); // 目标值可能在左半部分
    }
}

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

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

相关文章

Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…

实现一个通讯录

目录 项目要求及功能实现 通讯录的代码实现 contact.h: contanct.c main.c 项目要求及功能实现 1、可以存放100个人的信息 2、每个人的信息 名字 性别 年龄 电话 地址 3、增加联系人 4、删除指定联系人 5、查找指定联系人 6、修改指定联系人 7、显示联系人信息 8、排…

运维笔记111

运维笔记 Navicat中查询指定字段名所在的表名tomcat设置JVM的初始堆内存修改catalina.sh文件修改完保存并关闭tomcat启动tomcat 查询数据库连接数查询是否存在死锁 Navicat中查询指定字段名所在的表名 SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME‘替换成你要…

Redis-Redis 高级数据结构 HyperLogLog与事务

Redis 高级数据结构 HyperLogLog HyperLogLog(Hyper [ˈhaɪpə(r)] ) 并不是一种新的数据结构 ( 实际类型为字符串类 型) &#xff0c;而是一种基数算法 , 通过 HyperLogLog 可以利用极小的内存空间完成独立总数的统计&#xff0c;数据集可以是 IP 、 Email 、 ID 等。 如…

【brew】Mac上安装vue3

先安装node。 这里我从其他博客找的方案&#xff0c;原始脚本下载太慢了。 cnpm的安装&#xff1a; 让npm更快一点。 npm install -g cnpm --registryhttps://registry.npm.taobao.org安装vue脚手架 2.0版本&#xff1a;sudo npm install -g vue-cli 3.0版本&#xff1a; sud…

对话式数据需求激增,景联文科技提供高质量多轮对话数据定制采集标注服务

大模型的快速发展使得数据服务需求激增&#xff0c;产品整体处于供不应求状态。对话式数据集成为当下需求热点&#xff0c;人们对于更复杂、更真实的多轮对话数据需求不断增加&#xff0c;定制化服务占据市场需求主流。 通过对多轮对话数据的训练&#xff0c;模型可以更好地理解…

解析Top-K问题及堆排序算法

Top-K问题是在海量数据中找到最大或最小的K个元素&#xff0c;它在实际应用中非常常见&#xff0c;例如专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。在面对大规模数据时&#xff0c;直接对数据进行排序可能效率低下&#xff0c;因为排序的时间复杂度通常为O(n lo…

Notepad++批量添加引号

工作中经常会遇到这样情景&#xff1a;业务给到一批订单号&#xff0c;需要查询这批订单的某些字段信息。在where条件中需要传入这些订单号的数组&#xff0c;并且订单号用引号引起&#xff0c;用引号隔开。 字符串之间长度相同 可以按住CtrlAlt和鼠标左键选中区域&#xff0…

IDEA如何配置Git 遇到问题的解决

新建项目 点击 会变红 会生成.git隐藏文件 配置远程仓库路径&#xff1a;点击Manage Remotes&#xff1a;将远程仓库的链接放到这里&#xff1a; 得到如下样式&#xff1a; 此时提交到本地仓库 点击add&#xff0c;添加到暂存文件&#xff1a; 此时文件变绿&#xf…

力扣日记11.28-【二叉树篇】二叉树的最小深度

力扣日记&#xff1a;【二叉树篇】二叉树的最小深度 日期&#xff1a;2023.11.28 参考&#xff1a;代码随想录、力扣 111. 二叉树的最小深度 题目描述 难度&#xff1a;简单 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点…

Gitee-PicGo-Typora

Gitee-PicGo-Typora 问题引出 问题1&#xff1a;根据相关法律法规和政策&#xff0c;您的部分文件因存在敏感信息而无法显示 就在昨晚&#xff0c; 我在记笔记的时候&#xff0c;发现之前配置的七牛云图床出了问题&#xff1a; 1、根据相关法律法规和政策&#xff0c;您的部…

联邦学习(Federated Learning)

联邦学习&#xff08;Federated Learning&#xff09;是一种保护用户隐私的分布式机器学习方法&#xff0c;在联邦学习中&#xff0c;模型的训练是在分布式的客户端设备上进行的&#xff0c;而模型的更新则是在中央服务器上进行的。联邦学习的目标是通过共享模型而不是原始数据…

C# 使用 Fody 监控方法执行时间

写在前面 在做性能调优的时候&#xff0c;经常需要跟踪具体方法的执行时间&#xff1b;通过插入Stopwatch的方案对代码的侵入性太高了&#xff0c;所以引入了 MethodTimer.Fody 类库&#xff0c;采用编译时注入的方式给方法动态加上Stopwatch 跟踪代码&#xff0c;只需要在目标…

探索低代码之路——JNPF

目录 一、低代码行业现状 二、产品分析 1.可视化应用开发 2.流程管理 3.整个平台源码合作 三、架构和技术 技术栈 四、规划和展望 低代码平台&#xff08;Low-code Development Platform&#xff09;是一种让开发者通过拖拽和配置&#xff0c;而非传统的手动编写大量代…

geoserver根据数据字段动态设置样式

一、数据展示&#xff1a; 二、样式设置 <?xml version"1.0" encoding"UTF-8"?> <StyledLayerDescriptor version"1.0.0" xsi:schemaLocation"http://www.opengis.net/sld StyledLayerDescriptor.xsd" xmlns"http://…

从0开始学习JavaScript--JavaScript 模板字符串的全面应用

JavaScript 模板字符串是 ES6 引入的一项强大特性&#xff0c;它提供了一种更优雅、更灵活的字符串拼接方式。在本文中&#xff0c;将深入探讨模板字符串的基本语法、高级用法以及在实际项目中的广泛应用&#xff0c;通过丰富的示例代码带你领略模板字符串的魅力。 模板字符串…

Efficient RGB-T Tracking via Cross-Modality Distillation

摘要 目前大多数RGB-T跟踪器采用双流结构来提取单个RGB和热红外特征&#xff0c;并采用复杂的融合策略来实现多模态特征融合&#xff0c;这需要大量的参数&#xff0c;阻碍了它们的实际应用。另一方面&#xff0c;一个紧凑的RGB-T跟踪器可能具有计算效率&#xff0c;但由于特征…

01数仓平台 Hadoop介绍与安装

Hadoop概述 Hadoop 是数仓平台的核心组件。 在 Hadoop1.x 时代&#xff0c;Hadoop 中的 MapReduce 同时处理业务逻辑运算和资源调度&#xff0c;耦合性较大。在 Hadoop2.x 时代&#xff0c;增加了 Yarn。Yarn 只负责资源的调度&#xff0c;MapReduce 只负责运算。Hadoop3.x 在…

开源好用EasyImages简单图床源码

开源好用EasyImages简单图床源码分享&#xff0c;虽然它是开源程序&#xff0c;但功能一点也不弱&#xff0c;不仅支持多文件上传、文字/图片水印、支持API和鉴黄、还能自定义代码&#xff0c;最重要的是它不强制使用数据库运行&#xff0c;这就给我们的部署和维护带来极大方便…

GDPU 数据结构 天码行空12

文章目录 数据结构实验十二 图的遍历及应用一、【实验目的】二、【实验内容】三、实验源代码&#x1f37b; CPP&#x1f37b; C 数据结构实验十二 图的遍历及应用 一、【实验目的】 1、 理解图的存储结构与基本操作&#xff1b; 2、熟悉图的深度度优先遍历和广度优先遍历算法…