当前位置: 首页 > news >正文

C/C++ 每日一练:二分查找

        二分查找是一种高效的查找算法,用于在有序数组中定位目标元素的位置。它的核心思想是每次查找时将范围缩小一半。

题目要求

        实现一个二分查找算法。给定一个递增排序的整型数组 arr 和一个目标值 target,编写一个函数 binarySearch,若 target 存在于 arr 中,则返回其索引;否则返回 -1。算法的时间复杂度要求为 O(log n),适用于有序数组的查找。

        示例:

输入: arr = [1, 2, 4, 5, 7, 8, 9], target = 5
输出: 3输入: arr = [1, 2, 4, 5, 7, 8, 9], target = 3
输出: -1

做题思路

        二分查找是一种在 有序数组 中查找元素的高效方法,通过每次将查找范围缩小一半,使得查找效率达到 O(log n)。这个算法适用于有序数组,且每次查找步骤都是在查找范围的中间值进行判断:

  1. 确定查找范围:定义 left 和 right 两个指针,分别指向数组的起始位置和末尾位置。
  2. 中间元素判断:每次循环中,计算 mid = left + (right - left) / 2。检查 arr[mid] 是否等于目标值 target。
    • 若 arr[mid] == target,则找到目标值并返回 mid。
    • 若 arr[mid] < target,则舍弃左半部分,将 left 更新为 mid + 1,表示在右半部分继续查找。
    • 若 arr[mid] > target,则舍弃右半部分,将 right 更新为 mid - 1,表示在左半部分继续查找。
  3. 返回结果:重复以上步骤直到 left > right。若此时未找到目标值,说明 target 不在数组中。若最终未找到目标值,返回 -1。

运用到的知识点

  1. 数组:理解数组的基本操作。
  2. 指针:使用左右指针来标记查找范围。
  3. 循环和条件判断while循环控制查找过程,条件判断用于判断范围和定位目标值。
  4. 算法时间复杂度分析:二分查找的时间复杂度为 O(log n),适用于有序数据查找。

示例代码

C 实现

#include <stdio.h> // 引入标准输入输出库,用于printf函数  // 二分查找函数,返回目标值的索引,若未找到则返回 -1  
int binarySearch(int arr[], int size, int target) {int left = 0;           // 定义左指针,初始化为数组的第一个元素位置  int right = size - 1;    // 定义右指针,初始化为数组的最后一个元素位置  while (left <= right) {  // 当左指针不超过右指针时,继续执行查找过程  int mid = left + (right - left) / 2; // 计算中间位置,避免直接(left + right) / 2可能导致的整型溢出  if (arr[mid] == target) {  // 如果中间位置的值等于目标值  return mid;            // 找到目标值,返回其索引  }else if (arr[mid] < target) { // 如果中间位置的值小于目标值  left = mid + 1;         // 更新左指针,向右移动一位,在右半部分继续查找  }else {                    // 如果中间位置的值大于目标值  right = mid - 1;        // 更新右指针,向左移动一位,在左半部分继续查找  }}return -1; // 如果循环结束仍未找到目标值,返回-1表示未找到  
}int main() 
{int arr[] = { 1, 2, 4, 5, 7, 8, 9 }; // 定义一个已排序的整数数组  int size = sizeof(arr) / sizeof(arr[0]); // 计算数组的大小,即元素个数  int target = 5; // 定义要查找的目标值  int result = binarySearch(arr, size, target); // 调用二分查找函数,传入数组、大小和目标值,获取查找结果  if (result != -1) { // 如果查找结果不为-1,表示找到了目标值  printf("元素 %d 在索引 %d\n", target, result); // 输出目标值及其索引  }else { // 如果查找结果为-1,表示未找到目标值  printf("元素 %d 未找到\n", target); // 输出未找到目标值的提示  }return 0; // 程序正常结束,返回0  
}

C ++实现

#include <iostream> // 引入输入输出流库,用于输入输出操作  
#include <vector>   // 引入向量库,用于存储动态数组  using namespace std; // 使用标准命名空间,避免每次调用标准库时都需要加std::前缀  // 二分查找函数,接收一个整数向量和目标值,返回目标值的索引,若未找到则返回 -1  
int binarySearch(const vector<int>& arr, int target) {int left = 0;                     // 定义左指针,初始化为0,指向数组的第一个元素  int right = arr.size() - 1;        // 定义右指针,初始化为数组的最后一个元素的索引  while (left <= right) {            // 当左指针不超过右指针时,继续执行循环进行查找  int mid = left + (right - left) / 2; // 计算中间位置索引,避免(left + right)直接相加可能导致的整型溢出  if (arr[mid] == target) {      // 如果中间位置的值等于目标值  return mid;                // 找到目标值,返回其索引  }else if (arr[mid] < target) { // 如果中间位置的值小于目标值  left = mid + 1;             // 更新左指针,向右移动一位,在右半部分继续查找  }else {                        // 如果中间位置的值大于目标值  right = mid - 1;            // 更新右指针,向左移动一位,在左半部分继续查找  }}return -1; // 如果循环结束仍未找到目标值,返回-1表示未找到  
}int main() 
{vector<int> arr = { 1, 2, 4, 5, 7, 8, 9 }; // 定义一个整数向量,并初始化为已排序的数组  int target = 5; // 定义要查找的目标值  int result = binarySearch(arr, target); // 调用二分查找函数,传入向量和目标值,获取查找结果  if (result != -1) { // 如果查找结果不为-1,表示找到了目标值  cout << "元素 " << target << " 在索引 " << result << endl; // 输出目标值及其索引  }else { // 如果查找结果为-1,表示未找到目标值  cout << "元素 " << target << " 未找到" << endl; // 输出未找到目标值的提示  }return 0; // 程序正常结束,返回0  
}

相关文章:

C/C++ 每日一练:二分查找

二分查找是一种高效的查找算法&#xff0c;用于在有序数组中定位目标元素的位置。它的核心思想是每次查找时将范围缩小一半。 题目要求 实现一个二分查找算法。给定一个递增排序的整型数组 arr 和一个目标值 target&#xff0c;编写一个函数 binarySearch&#xff0c;若 targe…...

Linux基础IO--重定向--缓冲区

1&#xff0c;为什么语言喜欢做封装&#xff1f; 我们先知道一个概念&#xff0c;显示器叫做字符设备&#xff0c;根据ACSLL码来打印数据&#xff0c;所以我们从键盘输入的 1234&#xff0c;在显示器看来就是一个一个的字符(1,2,3,4)而不是一千两百三十四: 下图输入字符类型数…...

Conda 安装与使用指南

Conda 是一个开源的软件包管理和环境管理系统&#xff0c;主要解决一个系统上同时要使用python2&#xff0c;python3等等多个python环境的切换问题&#xff0c;支持多种编程语言&#xff08;如 Python、R 等&#xff09;&#xff0c;可以在 Windows、macOS 和 Linux 上运行。它…...

C++中获取硬盘ID的方法

在C++中,直接获取硬盘的ID(通常是硬盘的序列号或唯一标识符)并不是一项简单的任务,因为这通常涉及到低级的硬件访问,这通常是由操作系统或特定的硬件驱动程序管理的。标准C++库并没有提供直接访问硬盘ID的功能。 然而,可以通过以下几种方法来获取硬盘的ID: 操作系统特定…...

OpenRTP 传输增加OpenRTPServer

开源地址 最近增加了OpenRTPServer&#xff0c; 已经修改完成一版放在了目录下&#xff0c;window和linux下编译都成功了&#xff0c;不过由于修改代码CMakefile 需要修改&#xff0c;先放放 OpenRTP开源地址 vlc得纠错传输方式 我发现我代码写错以后&#xff0c;vlc 依然能…...

使用vue3+cesium+earthsdk+supermap实现通视分析(有版本报错问题)

main.js: 这个文件是项目的入口文件,主要进行了以下操作: 使用Vue 3的createApp创建应用实例。加载了element-plus UI 组件库。加载了router和store,以及axios用于发送HTTP请求。将@turf/turf和自定义的bus.js注册到全局属性中,便于在组件中使用。环境配置需求: 你需要安…...

python 轮子是什么

此一词语的由来是因为轮子由人类所发明&#xff0c;且在各方面都带来许多便利。既然轮子已被发明&#xff0c;而且在使用上没有什么缺陷&#xff0c;重新再发明一次轮子是没有意义的&#xff0c;只是浪费时间&#xff0c;分散研究者的资源&#xff0c;使其无法投入更有意义及价…...

农作物大豆病虫害识别分类数据集(猫脸码客第227期)

农作物大豆病虫害识别分类数据集 大豆&#xff0c;作为全球重要的粮食作物之一&#xff0c;不仅承载着人类饮食中的重要角色&#xff0c;还深刻影响着农业经济的发展。然而&#xff0c;大豆的生长过程中&#xff0c;常常面临着来自病害和虫害的双重威胁。这些病虫害不仅会影响…...

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…...

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装&#xff1a;便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后&#xff0c;选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…...

C++ (8) C++11及更新特性:探索魔法新领域

C11及更新特性&#xff1a;探索魔法新领域 随着C语言的不断进化&#xff0c;C11及其后续版本带来了许多激动人心的新特性&#xff0c;它们就像是魔法世界中新发现的领域&#xff0c;充满了无限的可能性。这些新特性不仅提高了编程的效率和灵活性&#xff0c;还为程序员提供了更…...

【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML

mammoth.convertToHtml(input, options&#xff09; &#xff1a;把源文档转换为 HTML 文档 mammoth.convertToMarkdown(input, options) &#xff1a;把源文档转换为 Markdown 文档。 mammoth.extractRawText(input) &#xff1a;提取文档的原始文本。这将忽略文档中的所有格式…...

HarmonyOS介绍 第一课习题答案

一、判断题 1. “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。为了实现这一目的,HarmonyOS提供了多端开发环境,多端开发能力以及多端分发机制。 正确(True)错误(False) 正确(True)回答正确 2. 《鸿蒙生态应用开发白皮书》全面阐释了鸿蒙生态下应…...

c/c++ stdcall cdel fastcall等函数调用约定说明

调用约定&#xff08;Calling Conventions&#xff09;是编程中定义函数如何接收参数、返回值以及如何管理堆栈的协议。主要的调用约定包括 __cdecl、__stdcall、__fastcall 和 __thiscall 等。下面将详细介绍这些调用约定的特点及其适用场景。 1. __cdecl 调用约定 定义&…...

【ROS概述】概念及环境搭建

学习途径&#xff1a; 教程&#xff1a;Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 课程视频&#xff1a;https://www.bilibili.com/video/BV1Ci4y1L7ZZ 机器人体系 要完全实现一个机器人的系统研发&#xff0c;几乎是“全栈”开发&#xff0c;…...

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息&#xff0c;包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息&#xff0c;此处生成2万名学生&#xff0c;学生所有信息都是给定范围后随机生成。 生成学生信息后&#xff0c;再来对学生信息进行简单查询。…...

java核心技术点都有哪些

1. 面向对象编程&#xff08;OOP&#xff09; 核心概念&#xff1a;类、对象、继承、封装、多态。 比喻&#xff1a;面向对象编程就像是在搭建一个积木城堡。类&#xff08;Class&#xff09;是城堡的设计图纸&#xff0c;它定义了城堡的结构和功能&#xff1b;对象&#xff08…...

4404 - 提高:二分与三分:曲线(三分)

明明做作业的时候遇到了n个二次函数Si(x)=ax22+bx+c,他突发奇想设计了一个新的函数F(x)=max(Si(x)), i=1,2...n。 明明现在想求这个函数在[0,10000]的最小值,要求精确到小数点后四位四舍五入。 输入 输入包含T 组数据 (T<10) ,每组第一行一个整数 n(n≤10000) ,之后n行…...

软件工程--需求分析与用例模型

面向对象分析(ObjectOrientedAnalysis&#xff0c;简称OOA) 分析和理解问题域&#xff0c;找出描述问题域所需的类和对象&#xff0c;分析它们的内部构成和外部关系&#xff0c;建立独立于实现的OOA模型&#xff0c;暂时忽略与系统实现有关的问题。 主要使用UML中的以下几种图…...

预测房价学习

1. 实现函数来方便下载数据 import hashlib import os import tarfile import zipfile import requestsDATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)):"""下载一个DATA_HUB中…...

电脑无法上网,但是微信、QQ可以正常使用

这种情况一般是由于DNS服务器配置错误&#xff0c;或者已有的DNS服务器无法正常解析地址造成的。 按下winR打开运行&#xff0c;输入ncpa.cpl&#xff0c;点击确定。 在打开的网络连接窗口中找到对应的网卡&#xff0c;双击打开。一般有线网是“以太网”&#xff0c;无线网&am…...

C++11新特性(列表初始化与右值引用折叠与完美转发)

c11 列表初始化c98的{}c11的{}std::initializer_list 右值引用和移动语义左值和右值的概念左值引用和右值引用引用延长临时对象生命周期左值和右值的参数匹配左值引用的主要使用场景移动构造和移动赋值引用折叠完美转发 列表初始化 c98的{} 在C98中&#xff0c;大括号 {} 的使…...

基于SSH的物流运输货运车辆管理系统源码

基于经典的ssh&#xff08;Spring Spring MVC Hibernate&#xff09;框架与SaaS&#xff08;软件即服务&#xff09;模式&#xff0c;我们为运输企业与物流公司打造了一款开源且易用的车辆管理系统。 该系统主要包含以下核心模块&#xff1a; 档案管理 财务管理 借款管理 保…...

基于RabbitMQ,Redis,Redisson,RocketMQ四种技术实现订单延时关闭功能及其相关优缺点介绍(以12306为主题)

目录 1. 延迟关闭订单 1.1 订单延时关闭功能技术选型 1.1.1 定时任务 1.1.2 RabbitMQ 1.1.3 Redis 过期监听 1.1.4 Redisson 1.1.5 RocketMQ 1.2 RocketMQ订单延时关闭发送方实现 1.3 RocketMQ订单延时关闭的消费方实现 1. 延迟关闭订单 用户发起订单后&#xff0c;如…...

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换&#xff0c;在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS&#xff0c;也提供了C语言的支持&#xff0c;对于一些能力&#xff…...

腾讯云或阿里云centos7安装Redis,并解决端口无法访问的问题

问题背景 最近自建的网站JeecgFlow在云环境安装redis时候&#xff0c;出现端口无法远程进行访问。 浪费好了好久时间进行排查&#xff0c; 记录一下Redis在云环境centos7环境下如何安装&#xff0c;并且远程访问。 Redis安装 //安装c 用于编译redis yum install gcc-c//在/u…...

【小问题】距离估计和频率估计的方差下界推导出距离估计的方差下界

【1】OFDM Radar Algorithms in Mobile Communication Networks pp34 文章目录 1. 频率和距离之间的关系2. 计算 d ^ \hat{d} d^ 对 n ^ \hat{n} n^ 的导数3. 将频率的方差转化为距离的方差4. 从频率的 CRB 获得 var ⁡ [ n ^ ] \operatorname{var}[\hat{n}] var[n^]5. 将 …...

Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容

介绍 在当今数据驱动的世界中&#xff0c;抓取动态网页内容变得越来越重要&#xff0c;尤其是像抖音这样的社交平台&#xff0c;动态加载的评论等内容需要通过特定的方式来获取。传统的静态爬虫方法难以处理这些由JavaScript生成的动态内容&#xff0c;Selenium爬虫技术则是一…...

Z-BlogPHP显示错误Undefined array key 0 (set_error_handler)的解决办法

今天打开博客的时候&#xff0c;意外发现页面&#xff0c;打开均显示错误&#xff1a;Undefined array key 0 (set_error_handler)。 博客程序采用的是Z-BlogPHP。百度了一圈没有找到解决办法&#xff0c;在官方论坛里也没找到解决办法。 于是开始自己排查原因。我服务器采用…...

java-实例化一个List,然后添加数据的方法详解

在Java中&#xff0c;实例化一个 List 并向其中添加数据非常简单。List 是一个接口&#xff0c;因此我们通常使用它的常见实现类 ArrayList 或 LinkedList。以下是一些常见的操作方法&#xff1a; ### 1. 使用 ArrayList 实例化并添加数据 java import java.util.ArrayList; …...

临沂企业自助建站/外贸建站

图解TCP数据报结构以及三次握手&#xff08;非常详细&#xff09; TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;数据在传输前要建立连接&#xff0c;传输完毕后还要断开连接…...

常州做网站公司有哪些/哪里能买精准客户电话

胎压监测 (15分) 小轿车中有一个系统随时监测四个车轮的胎压&#xff0c;如果四轮胎压不是很平衡&#xff0c;则可能对行车造成严重的影响。 taiya.JPG 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#x…...

网站建设合同.doc/有创意的营销案例

guan大数据挖掘最深入人心的一个故事应该是“啤酒与尿布”&#xff0c;这个规律就是用关联分析发现的。今天我们就来点关联分析&#xff0c;刚刚学到的&#xff0c;现学现分享?。下面假设是某超市的交易记录&#xff08;我编造的&#xff09;基本概念我们在关联分析之前先了解…...

网络工程有限公司/品牌企业seo咨询

965. 单值二叉树 难度简单69 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;true示例…...

网站做信息流/seo人人网

题目1&#xff1a;有1-60 60个数字&#xff0c;然后对应把它们随机分成6组&#xff0c;每组10个数。问数字1和数字2分到同组的概率&#xff1f; 我觉得答案是 9/59 同学不信&#xff0c;所以回来又仔细思考了一下&#xff0c;因为笔试的时候是很随意地想的。 笔试时候的想法&…...

表白时刻网站/济南百度公司

#css基本语法及页面引用 ##css基本语法 css的定义方法是&#xff1a; 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称&#xff0c;属性是希望设置的样式属性每个属性有一个或多个值。代码示例&#xff1a; div{ width:100px; height:100px; …...