二分查找算法:穿越算法迷宫的指南

news2024/11/16 19:58:56

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

目录

前言

一.  二分查找算法介绍

二 二分查找的题目解析

2.1 二分查找

2.2 在排序数组中查找元素的第一个位置和最后一个位置

2.3 搜索插入位置 

2.4 x的平方根 

 2.5 山峰数组峰顶的索引

 2.6 寻找峰值

2.7 寻找旋转数组中的最小值 

2.8 点名 

 三. 二分算法总结+模板

总结


前言

本篇详细介绍了二分查找算法的使用,让使用者了解二分查找,而不是仅仅停留在表面, 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!


一.  二分查找算法介绍

二. 二分查找的题目解析

开始之前可以去总结部分被去看看模板,再结合题目理解

2.1 二分查找

704. 二分查找 - 力扣(LeetCode)

 思路:(模版1)正常的二分查找策略

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

2.2 在排序数组中查找元素的第一个位置和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

思路:找第一个,用左区间端点查找(模版2),找最后一个,用右端点区间查找(模版3) 

 

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        //处理边界情况
        if(nums.size() == 0) return {-1,-1};
        int left = 0;
        int right = nums.size()-1;
        int first = 0;
        //  1.二分左端点
        while(left<right)  //先找第一次的
        {
            int mid = (right - left)/2+left;
            if(nums[mid] >= target)
            {
                right = mid;
            }
            else
            {
                left = mid +1;
            }
        }
        //判断是否有结果
        if(nums[left] != target) return {-1,-1};
        else first = left;  //标记一下左端点
 
        //  2.二分右端点
        left = 0,right = nums.size()-1;
        while(left<right)
        {
            int mid = (right - left+1)/2+left;
            if(nums[mid] <= target)
            {
                left = mid;
            }
            else
            {
                right = mid -1;
            }
        }
        
        return {first,right};
    }
};

2.3 搜索插入位置 

35. 搜索插入位置 - 力扣(LeetCode) 

 思路:左端区间查找 (右区间查找也行

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

2.4 x的平方根 

69. x 的平方根 - 力扣(LeetCode) 

思路:右端区间二分查找法 

class Solution {
public:
    int mySqrt(int x) {
        if(x == 0) return 0; //处理边界情况
        int left = 1, right = x;
        while(left<right)
        {
            long long mid = (right - left + 1) /2+left; //防溢出
            if(mid*mid<=x) left = mid;
            else right = mid - 1;
        }
        return left;
    }
};

 2.5 山峰数组峰顶的索引

852. 山脉数组的峰顶索引 - 力扣(LeetCode) 

思路:左或右端区间查找

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

 2.6 寻找峰值

162. 寻找峰值 - 力扣(LeetCode) 

 思路:左或右端点区间查找

 右区间:

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

2.7 寻找旋转数组中的最小值 

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

思路:左区间端点查找法 

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

2.8 点名 

LCR 173. 点名 - 力扣(LeetCode)

 思路:左区间查找

class Solution {
public:
    int takeAttendance(vector<int>& records) {
        int left = 0, right = records.size()-1;
        while(left<right)
        {
            int mid = (right - left)/2+left;
            if(records[mid] == mid) left = mid + 1;
            else right = mid;
        }
        //处理细节问题:最后一个位置缺少
        return records[left] == left ? left+1 : left;
    }
};

 三. 二分算法总结+模板

二分查找的策略基本上都是去找一个数,对应的有三种模版:正常的二分查找、左区间端点查找、右区间端点查找。其中正常的二分查找局限性比较大,必须得是升序且限制条件较多,大多数情况下不符合题意。最常用的就是左区间端点(关键是left会大跳跃,且目标位置在较大值区间的左边)和右区间端点法(关键是right会大跳跃,且目标位置在较小值区间的右边)。 

图from:算法思想总结:二分查找算法-CSDN博客 


总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解二分查找算法,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

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

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

相关文章

5.所有权

标题 一、概念二、规则三、示例3.1 变量作用域3.2 所有权的移交&#xff08;深拷贝与浅拷贝&#xff09;3.3 函数与所有权3.4 返回值与作用域3.5 引用的使用 四、切片(&str) 一、概念 所有权是Rust的核心特性。所有程序在运行时都必须管理它们使用计算机内存的方式。Rust的…

java float 丢失的小数位,科学计数法陷阱

从不同的table&#xff0c;不同的Sql 获取的统计数据&#xff0c;map中有float 也有double数据。 只要定义的数据类型是float&#xff0c;即使最后转成double&#xff0c;其实精度都会损失。 float通过科学计数法&#xff0c;10 N次方&#xff0c;对于大数没有办法保留小数位。…

Docker 基础使用 (4) 网络管理

文章目录 Docker 网络管理需求Docker 网络架构认识Docker 常见网络类型1. bridge 网络2. host 网络3. container 网络4. none 网络5. overlay 网络 Docker 网路基础指令Docker 网络管理实操 Docker 基础使用(0&#xff09;基础认识 Docker 基础使用(1&#xff09;使用流程概览 …

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句&#xff0c;主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时&#xff08;即试图插入的记录的键值已经存在于表中&#xff09;&#xff0c;此子句会触发一…

如何免费获取云服务器

这几天刚入手了阿贝云的 “免费云服务器 ” &#xff0c;接下来给大家讲讲如何免费注册阿贝云的免费云服务器 如何获取免费云服务器 打开阿贝云官网&#xff0c;注册并认证 即可以领取免费云服务器 阿贝云地址&#xff1a;https://www.abeiyun.com/ 服务器优势 永久免费&…

R语言:str_view函数和writeLines函数的区别

str_view和writeLines都是R语言中用于处理和查看字符串的函数&#xff0c;但它们有不同的功能和用途。 str_view str_view 是 stringr 包中的一个函数&#xff0c;用于直观地显示字符串中模式的匹配情况。它会在RStudio Viewer窗格中生成一个HTML小部件&#xff0c;突出显示字…

混剪素材哪里找?分享8个热门素材网站

今天我们来深入探讨如何获取高质量的混剪素材&#xff0c;为您的短视频和自媒体制作提供最佳资源。在这篇指南中&#xff0c;我将介绍几个热门的素材网站&#xff0c;让您轻松掌握素材获取的技巧&#xff0c;并根据百度SEO排名规则&#xff0c;优化关键词的使用&#xff0c;确保…

游戏提示emp.dll丢失是怎么回事,哪种解决方法更值得推荐

在玩电脑游戏时&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到emp.dll&#xff0c;无法继续执行代码”。这个问题会导致游戏无法启动运行。那么&#xff0c;究竟是什么原因导致了这个问题的出现呢&#xff1f;本文将从多个方面进行详细解析&…

encoding Token和embedding 傻傻分不清楚?

encoding 编码 “encoding” 是一个在计算机科学和人工智能领域广泛使用的术语&#xff0c;它可以指代多种不同的过程和方法。核心就是编码&#xff1a;用某些数字来表示特定的信息。当然你或许会说字符集(Unicode)更理解这种概念&#xff0c;编码更强调这种动态的过程。而字符…

NVIDIA Jetson AI边缘计算盒子

这里写自定义目录标题 烧录系统安装Jetpack 烧录系统 选择一台Linux系统&#xff0c;或者VMware的电脑作为主机&#xff0c;烧录系统和后面安装Jetpack都会用到。 根据供应商的指令烧录的&#xff0c;暂时还没验证官方烧录&#xff08;后续验证补充&#xff09;。 安装Jetpac…

tmux 移植到ARM板端运行环境搭建

tmux源码下载&#xff1a; Home tmux/tmux Wiki GitHub 依赖的库代码下载&#xff1a; libevent&#xff1a; ncurses: 第一步&#xff1a;将以上三个代码解压放在同一个目录下&#xff0c;逐个编译 1. cd ./libevent-2.1.12-stable ./configure --host"arm-nextvp…

rockchip ARM TrustZone

系统架构 分为安全世界和非安全世界。Loader、Trust 运行在安全世界&#xff1b;U-Boot、kernel、Android 运行在非安全世界里&#xff08;安全的 driver、APP 除外&#xff09;。 “hypervisor”常见释义为“管理程序”“虚拟机监控器”“超级监督者”。 它是一种可以创建、…

63-目录操作(QDir类)及展示系统文件实战

一、目录操作(QDir 类) #include <QCoreApplication>#include <QDir> #include <QStringList> #include <QtDebug>// 自定义函数实现获取目录下大小qint64 GetDirFileInfoSizeFunc(const QString &qpath) {// QDir类专门用来操作路径名称或底层文…

springboot三层架构与MVC,以及三层架构入门

三层架构与MVC 1. 三层架构是什么 把各个功能模块划分为表示层&#xff0c;业务逻辑层&#xff0c;和数据访问层三层架构&#xff0c;各层之间采用接口相互访问&#xff0c;并通过对象模型的实体类&#xff08;model&#xff09;作为数据传递的载体&#xff0c;不同的对象模型…

任务倒计时App

设计背景 在某一阶段可能需要给自己设置长期任务&#xff0c;比如找工作、考研等&#xff0c;需要一个单纯的任务计时工具&#xff0c;设置完任务的目标时间后&#xff0c;每次打开App时都能直接看到最新的剩余时间 设计步骤 1. 写java源码 由于需要界面显示&#xff0c;需…

pycharm下载和配置Anaconda环境

文章目录 一、 pycharm安装二、 安装 一、 pycharm安装 官网下载&#xff1a; https://www.jetbrains.com/pycharm/download/#sectionwindows Pycharm community Edition是免费的 二、 安装 安装目录有需要的可以自己更改。 三、创建项目 打开pycharm->继续->不发送。…

【UE数字孪生学习笔记】 虚幻日志系统

声明&#xff1a;部分内容来自于b站&#xff0c;知乎&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 虚幻日志系统 1. 日志是一种非常实用的调试工具&#xff0c;可以详细…

AI赋能银行国际结算审单:合合信息抽取技术的实践与应用

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 时下&#xff0c;银行国际业务是金融体系的重要组成部分&#xff0c;涵盖了外汇交易、国际结算、贸易融资、跨境投资等领域&#xff0c;这些业务对于国际贸易和全球经济发展具有重要作用。国际业务部门单据、凭证…

renren-fast-vue在mac上的运行

被这个折磨好久了&#xff0c;终于成功了。。 版本号-node-14 需要提前执行的命令&#xff0c;希望可以帮助到大家。分别是解决版本在mac m1架构上的不兼容问题&#xff0c;另外解决没有验证码的问题&#xff0c;要注意数据库的配置&#xff0c;账号密码是否正确。 npm inst…