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)。这个算法适用于有序数组,且每次查找步骤都是在查找范围的中间值进行判断:
- 确定查找范围:定义 left 和 right 两个指针,分别指向数组的起始位置和末尾位置。
- 中间元素判断:每次循环中,计算 mid = left + (right - left) / 2。检查 arr[mid] 是否等于目标值 target。
- 若 arr[mid] == target,则找到目标值并返回 mid。
- 若 arr[mid] < target,则舍弃左半部分,将 left 更新为 mid + 1,表示在右半部分继续查找。
- 若 arr[mid] > target,则舍弃右半部分,将 right 更新为 mid - 1,表示在左半部分继续查找。
- 返回结果:重复以上步骤直到 left > right。若此时未找到目标值,说明 target 不在数组中。若最终未找到目标值,返回 -1。
运用到的知识点
- 数组:理解数组的基本操作。
- 指针:使用左右指针来标记查找范围。
- 循环和条件判断:while循环控制查找过程,条件判断用于判断范围和定位目标值。
- 算法时间复杂度分析:二分查找的时间复杂度为
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++ 每日一练:二分查找
二分查找是一种高效的查找算法,用于在有序数组中定位目标元素的位置。它的核心思想是每次查找时将范围缩小一半。 题目要求 实现一个二分查找算法。给定一个递增排序的整型数组 arr 和一个目标值 target,编写一个函数 binarySearch,若 targe…...
Linux基础IO--重定向--缓冲区
1,为什么语言喜欢做封装? 我们先知道一个概念,显示器叫做字符设备,根据ACSLL码来打印数据,所以我们从键盘输入的 1234,在显示器看来就是一个一个的字符(1,2,3,4)而不是一千两百三十四: 下图输入字符类型数…...
Conda 安装与使用指南
Conda 是一个开源的软件包管理和环境管理系统,主要解决一个系统上同时要使用python2,python3等等多个python环境的切换问题,支持多种编程语言(如 Python、R 等),可以在 Windows、macOS 和 Linux 上运行。它…...
C++中获取硬盘ID的方法
在C++中,直接获取硬盘的ID(通常是硬盘的序列号或唯一标识符)并不是一项简单的任务,因为这通常涉及到低级的硬件访问,这通常是由操作系统或特定的硬件驱动程序管理的。标准C++库并没有提供直接访问硬盘ID的功能。 然而,可以通过以下几种方法来获取硬盘的ID: 操作系统特定…...
OpenRTP 传输增加OpenRTPServer
开源地址 最近增加了OpenRTPServer, 已经修改完成一版放在了目录下,window和linux下编译都成功了,不过由于修改代码CMakefile 需要修改,先放放 OpenRTP开源地址 vlc得纠错传输方式 我发现我代码写错以后,vlc 依然能…...
使用vue3+cesium+earthsdk+supermap实现通视分析(有版本报错问题)
main.js: 这个文件是项目的入口文件,主要进行了以下操作: 使用Vue 3的createApp创建应用实例。加载了element-plus UI 组件库。加载了router和store,以及axios用于发送HTTP请求。将@turf/turf和自定义的bus.js注册到全局属性中,便于在组件中使用。环境配置需求: 你需要安…...
python 轮子是什么
此一词语的由来是因为轮子由人类所发明,且在各方面都带来许多便利。既然轮子已被发明,而且在使用上没有什么缺陷,重新再发明一次轮子是没有意义的,只是浪费时间,分散研究者的资源,使其无法投入更有意义及价…...
农作物大豆病虫害识别分类数据集(猫脸码客第227期)
农作物大豆病虫害识别分类数据集 大豆,作为全球重要的粮食作物之一,不仅承载着人类饮食中的重要角色,还深刻影响着农业经济的发展。然而,大豆的生长过程中,常常面临着来自病害和虫害的双重威胁。这些病虫害不仅会影响…...
如何在算家云搭建GPT-SOVITS(语音转换)
一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…...
ThinkPad T480拆机屏幕改装:便携式显示器DIY指南
ThinkPad T480拆机屏幕改装:便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后,选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…...
C++ (8) C++11及更新特性:探索魔法新领域
C11及更新特性:探索魔法新领域 随着C语言的不断进化,C11及其后续版本带来了许多激动人心的新特性,它们就像是魔法世界中新发现的领域,充满了无限的可能性。这些新特性不仅提高了编程的效率和灵活性,还为程序员提供了更…...
【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML
mammoth.convertToHtml(input, options) :把源文档转换为 HTML 文档 mammoth.convertToMarkdown(input, options) :把源文档转换为 Markdown 文档。 mammoth.extractRawText(input) :提取文档的原始文本。这将忽略文档中的所有格式…...
HarmonyOS介绍 第一课习题答案
一、判断题 1. “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。为了实现这一目的,HarmonyOS提供了多端开发环境,多端开发能力以及多端分发机制。 正确(True)错误(False) 正确(True)回答正确 2. 《鸿蒙生态应用开发白皮书》全面阐释了鸿蒙生态下应…...
c/c++ stdcall cdel fastcall等函数调用约定说明
调用约定(Calling Conventions)是编程中定义函数如何接收参数、返回值以及如何管理堆栈的协议。主要的调用约定包括 __cdecl、__stdcall、__fastcall 和 __thiscall 等。下面将详细介绍这些调用约定的特点及其适用场景。 1. __cdecl 调用约定 定义&…...
【ROS概述】概念及环境搭建
学习途径: 教程:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 课程视频:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 机器人体系 要完全实现一个机器人的系统研发,几乎是“全栈”开发,…...
MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询
一、生成学生信息脚本 利用该脚本可以生成任意个学生信息,包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息,此处生成2万名学生,学生所有信息都是给定范围后随机生成。 生成学生信息后,再来对学生信息进行简单查询。…...
java核心技术点都有哪些
1. 面向对象编程(OOP) 核心概念:类、对象、继承、封装、多态。 比喻:面向对象编程就像是在搭建一个积木城堡。类(Class)是城堡的设计图纸,它定义了城堡的结构和功能;对象(…...
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,简称OOA) 分析和理解问题域,找出描述问题域所需的类和对象,分析它们的内部构成和外部关系,建立独立于实现的OOA模型,暂时忽略与系统实现有关的问题。 主要使用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中…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
