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

news2024/10/27 19:02:58

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

题目要求

        实现一个二分查找算法。给定一个递增排序的整型数组 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  
}

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

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

相关文章

三周精通FastAPI:14 表单数据和表单模型Form Models

官网文档&#xff1a;表单数据 - FastAPI 表单数据 接收的不是 JSON&#xff0c;而是表单字段时&#xff0c;要使用 Form表单。 from fastapi import FastAPI, Formapp FastAPI()app.post("/login/") async def login(username: str Form(), password: str Form…

【Nginx系列】如何使用 proxy_ignore_client_abort 提升性能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

多系统萎缩的探索与实践?

‌在神经系统疾病的广阔领域中&#xff0c;多系统萎缩以其复杂的病因和难治的特点&#xff0c;一直是医学界关注的焦点。刘家峰大夫&#xff0c;出生中医世家&#xff0c;对多系统萎缩的治疗有着独到的见解和丰富的实践经验。 刘家峰大夫认为&#xff0c;多系统萎缩虽表现为多…

OpenAI低调发布多智能体工具Swarm:让多个智能体协同工作!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

爬虫中代理ip 的选择和使用实战

一、爬虫中的反爬问题 爬虫技术不仅是一种工具&#xff0c;更像是一门捕捉信息的艺术。通过它&#xff0c;我们能够从浩瀚的互联网中&#xff0c;精确获取到所需的有价值数据。对于那些需要进行数据分析或模型训练的人来说&#xff0c;爬虫技术几乎是必备的技能。虽然网上公开…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足&#xff0c;创建了一个计算机管理个人理财系统的方案。文章介绍了个…

RestHighLevelClient操作es查询文档

目录 利用RestHighLevelClient客户端操作es查询文档 查询match_all dsl语句&#xff1a; ​编辑 java代码 小结 match字段全文检索查询 dsl语句 java代码 multi_match多字段全文检索查询 dsl语句 java代码 term精确查询 dsl语句 java代码 range范围查询 dsl语句 j…

信息学奥赛与其他四大奥赛的区别:深入分析与解读

五大学科奥赛&#xff0c;涵盖了信息学、数学、物理、化学和生物&#xff0c;每一学科竞赛的重点和考查方式都不同。信息学奥赛&#xff08;NOI&#xff09;与其他四科相比&#xff0c;独具编程和算法特性。本文将深入分析信息学奥赛与其他四科竞赛在考查内容、备赛方式、实践要…

《BLEU: a Method for Automatic Evaluation of Machine Translation》翻译

文章目录 0. 摘要1. 引言1.1 理由1.2 观点 2. 基准 BLEU 指标2.1 修正的 n-gram 精度2.1.1 对文本块的修正 n-gram 精度2.1.2 仅使用修正 n-gram 精度对系统进行排序2.1.3 结合修正的 n-gram 精度 2.2 句子长度2.2.1 召回率的问题2.2.2 句子简短惩罚 2.3 BLEU 细节 3. BLEU 评估…

芒果数据集(猫脸码客第230期)

芒果深度学习检测&#xff1a;开启农业新视界 一、引言 芒果作为一种重要的热带水果&#xff0c;在全球范围内具有广泛的市场需求和经济价值。随着人们生活水平的提高&#xff0c;对芒果的品质要求也越来越高。芒果产业的规模不断扩大&#xff0c;产量逐年增加&#xff0c;如…

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…

【Linux探索学习】第一弹——Linux的常用指令

目录 ​编辑 Linux常用命令 1 Linux命令初体验 1.1 常用命令演示 1). ls 2). pwd 3). cd 4). touch 5). mkdir 6). rm 1.2 Linux命令使用技巧 1.3 Linux命令格式 2 文件目录操作命令 2.1 ls 2.2 cd 2.3 cat 2.4 more 2.5 tail 2.6 mkdir 2.7 rmdir 2.8 rm…

《Windows PE》7.4 资源表应用

本节我们将通过两个示例程序&#xff0c;演示对PE文件内图标资源的置换与提取。 本节必须掌握的知识点&#xff1a; 更改图标 提取图标资源 7.4.1 更改图标 让我们来做一个实验&#xff0c;替换PE文件中现有的图标。如果手工替换&#xff0c;一定是先找到资源表&#xff0c;…

Telephony中ITelephony的AIDL调用关系

以Android14.0源码讲解 ITelephony来自framework下的com.android.internal.telephony包下 frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl这个接口用于与Phone交互的界面&#xff0c;主要由TelephonyManager类使用&#xff0c;一些地方仍在…

开拓鸿蒙测试新境界,龙测科技引领自动化测试未来

在当今科技舞台上&#xff0c;鸿蒙 OS 以非凡先进性强势登场&#xff0c;打破传统操作系统格局&#xff0c;为软件测试领域带来全新机遇与艰巨挑战。 一、鸿蒙 OS 的辉煌崛起 &#xff08;一&#xff09;壮丽发展历程与卓越市场地位 鸿蒙 OS 的发展如波澜壮阔的史诗。2023 年…

音视频开发之旅(98) -潜扩散模型(Latent Diffusion Model)原理及源码解析

目录 1.背景 2. 潜扩散模型&#xff08;Latent Diffusion Model&#xff09;原理 3. 应用场景 4. 推理源码解析 5. 资料 一、背景 前面我们分析扩散模型&#xff08;Diffusion Model&#xff09;了解到&#xff0c;它通过向数据中添加噪声&#xff0c;然后训练一个去噪模…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…

【mysql进阶】4-6. InnoDB 磁盘文件

InnoDB 磁盘⽂件 1 InnoDB存储引擎包含哪些磁盘⽂件&#xff1f; &#x1f50d; 分析过程 ✅ 解答问题 InnoDB的磁盘⽂件主要是表空间⽂件和其他⽂件&#xff0c;表空间包括&#xff1a;系统表空间、独⽴表空间、通⽤表空间、临时表空间和撤销表空间&#xff1b;其他⽂件有重做…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件&#xff0c;旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态&#xff0c;提升用户体验。 特征 可配置性&#xff1a;用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

JavaScript part2

一.前言 前面我们讲了一下js的基础语法&#xff0c;但是这些还是远远不够的&#xff0c;我们要想操作标签&#xff0c;实现一个动态且好看的页面&#xff0c;就得学会BOM和DOM&#xff0c;这些都是浏览器和页面的&#xff0c;这样我们才能实现一个好看的页面 二.BOM对象 BOM…