【算法笔记】二分算法原理的深度剖析

news2024/12/27 20:46:02

【算法笔记】二分算法原理的深度剖析

🔥个人主页大白的编程日记

🔥专栏算法笔记


文章目录

  • 【算法笔记】二分算法原理的深度剖析
    • 前言
    • 一.二分查找
      • 1.1题目
      • 1.2朴素二分
      • 1.3细节问题
      • 1.4代码实现
      • 1.5朴素模版总结
    • 二.在排序数组中查找第一个和最后一个元素的位置
      • 2.1题目
      • 2.2思路分析
      • 2.3代码实现
      • 2.4左右端点二分模板总结
    • 三.搜索插入位置
      • 3.1搜索插入位置
      • 3.2思路分析
      • 3.3代码实现
    • 四.寻找峰值
      • 4.1题目
      • 4.2思路分析
      • 4.3代码实现
    • 五.寻找旋转数组中的最小值
      • 5.1题目
      • 5.2思路分析
      • 5.3代码实现
    • 后言

前言

哈喽,各位小伙伴大家好!上期我们讲了滑动窗口的算法原理。今天我们来讲二分查找算法。话不多说,我们进入正题!向大厂冲锋!

一.二分查找

1.1题目

  • 题目:二分查找

1.2朴素二分

如果存在二段性我们就可以快速筛选掉一段不存在答案的区间

1.3细节问题

这里我们要注意循环结束条件和中点的查找。
在我们的朴素二分中中点取左端和右端都是可以的。

1.4代码实现

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

1.5朴素模版总结

这就是我们的朴素二分模版。具体括号的具体内容结合题目填充即可。?

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

2.1题目

  • 题目:在排序数组中查找第一个和最后一个元素的位置

2.2思路分析

  • 左端点
    在这里插入图片描述
  • 左端点细节问题
  • 右端点
  • 右端点细节问题

2.3代码实现

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) 
    {
        if(nums.size()==0)
        {
            return {-1,-1};
        }
        int left=0,right=nums.size()-1;
        int begin,end;
        while(left<right)//找左端点
        {
            int mid=left+(right-left)/2;//取左端点
            if(nums[mid]>=target)
            {
                right=mid;
            }
            else
            {
                left=mid+1;
            }
        }
        if(nums[left]!=target)
        {
           return {-1,-1};
        }
        begin=left;
        left=0,right=nums.size()-1;
        while(left<right)//找右端点
        {
            int mid=left+(right-left+1)/2;//取右端点
            if(nums[mid]<=target)
            {
                left=mid;
            }
            else
            {
                right=mid-1;
            }
        }
        if(nums[left]!=target)
        {
           return {-1,-1};
        }
        end=right;
        return {begin,end};
    }
};

2.4左右端点二分模板总结

  • 左端点

  • 右端点

  • 循环条件
    left<right

  • 中点操作

三.搜索插入位置

3.1搜索插入位置

  • 题目:搜索插入位置

3.2思路分析

我们只需要查找左端点即可。

3.3代码实现

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

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

四.寻找峰值

4.1题目

  • 题目:寻找峰值

4.2思路分析

4.3代码实现

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

五.寻找旋转数组中的最小值

5.1题目

  • 题目:寻找旋转数组中的最小值

5.2思路分析

5.3代码实现

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

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

后言

这就是二分算法的深度剖析。二分算法细节还是挺多的。大家自己好好梳理一下。今天就分享到这,感谢各位的耐心垂阅!咱们下期见!拜拜~

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

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

相关文章

用Arduino单片机制作一个简单的音乐播放器

Arduino单片机上有多个数字IO针脚&#xff0c;可以输出数字信号&#xff0c;用于驱动发声器件&#xff0c;从而让它发出想要的声音。蜂鸣器是一种常见的发声器件&#xff0c;通电后可以发出声音。因此&#xff0c;单片机可以通过数字输出控制蜂鸣器发出指定的声音。另外&#x…

视频色彩变幻剪辑:批量剪辑工具大揭秘

在视频剪辑领域&#xff0c;将视频画面添加一些色彩是一项常见需求。幸运的是&#xff0c;市面上存在多款批量剪辑工具&#xff0c;能够轻松实现这一剪辑&#xff0c;提升视频品质与观感。像视频剪辑高手一次可剪辑多个视频素材。易操作。一起来试试。 1打开“视频剪辑高手”软…

【时间之外】昔日销售大佬今求职难

目录 国庆结束 中年危机下的家庭缩影&#xff1a;昔日销售大佬今求职难 生存智慧之三大人生策略 国庆结束 今天是国庆节的最后一天假期了。 7天的大调休&#xff0c;搞得人非常疲惫&#xff0c;想想接下来还有5天的工作日&#xff0c;就觉得这个调休实在是烦人。 中年危机…

企业为什么需要MES系统?

企业为什么需要MES系统&#xff1f; 提高生产效率&#xff1a; MES系统能够实时采集生产现场的数据&#xff0c;并根据这些数据对生产计划进行动态调整&#xff0c;最大化设备利用率和产能。通过优化生产流程&#xff0c;减少生产中的非增值时间&#xff0c;提高整体生产效率。…

史上最强传奇资源编辑器

支持&#xff1a;WIL WIS WZL PAK&#xff08;GOM GEE V8 LEG&#xff09; 批量修改密码、全格式转换、文件归类、资源优化、坐标调整辅助、GIF动画生成、衣服武器合成一体 资料地址&#xff1a;史上最强传奇资源编辑器 - 工具软件程序 - 51开发者联盟 - 51SF.CC

C语言文件操作(下)(28)

文章目录 前言一、文件的打开和关闭打开打开模式相对路径和绝对路径 关闭 二、文件操作正确流程三、文件顺序读写函数fopenfclosefputcfgetcfputsfgetsfprintffscanfsprintfsscanffwritefread 四、文件随机读写函数fseekftellrewind 五、文件读取结束时候的判断feofferror具体例…

关于持续输出内容的思路分享及分析

一、核心内容 &#xff08;一&#xff09;亦仁的分享 来自V先生的小密圈&#xff0c;提出做垂直领域内容持续输出的思路。很多大 v 不敢开小密圈是担心内容持续输出问题。掌握一套方法论应用于无数场景&#xff0c;就有无数案例和素材。列举 10 个铜山&#xff1a;装修风格点…

浏览器前端向后端提供服务

WEB后端向浏览器前端提供服务是最常见的场景&#xff0c;前端向后端的接口发起GET或者POST请求&#xff0c;后端收到请求后执行服务器端任务进行处理&#xff0c;完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼&#xff1f; 说来话长&#xff0c;长话短说。我在人…

每日OJ题_牛客_组队竞赛_贪心_C++_Java

目录 牛客_组队竞赛_贪心 题目解析 C代码1 C代码2 Java代码 牛客_组队竞赛_贪心 组队竞赛_牛客笔试题_牛客网 (nowcoder.com) 描述&#xff1a; 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个…

C语言 assert 函数 - C语言零基础入门教程

目录 一.assert 函数简介二.assert 函数使用三.assert 函数用法总结与注意事项四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.assert 函数简介 对于断言&#xff0c;相信大家都不陌生&#xff0c;大多数编程语言也都有断言这一特性。简单地讲…

力扣题11~15

题11&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 这种题目第一眼就是双循环&#xff0c;但是肯定不行滴&#xff0c;o(n^2)这种肯定超时&#xff0c;很难接受。 所以要另辟蹊径&#xff0c;我们先用俩指针&#xff08;标志位&#xff09;在最左端和最右端&am…

20241007给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot是使用ADB

20241007给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Buildroot是使用ADB 2024/10/7 17:35 缘起&#xff1a;由于荣品RD-RK3588-AHD开发板使用的是9针的USB-A口&#xff0c;没有使用EVB4默认的type C口。 因此需要拿掉fusb302的驱动/DTS配置部分。 同时&#xff0c;为了简单起见…

小红书引流的4大方法

关注▲洋洋科创星球▲一起成长&#xff01; 01 精心设计账号简介 账号简介是您小红书账号的第一印象&#xff0c;它将在您的主页上展示给所有访问者&#xff0c;一个精心编写的简介不仅能够吸引用户的注意力&#xff0c;还能有效提升用户对您内容的兴趣。 利用小红书号建立联系…

C语言文件操作(上)(27)

文章目录 前言一、为什么要用文件&#xff1f;二、什么是文件&#xff1f;程序文件数据文件文件名文件类型文件缓冲区文件指针 三、流流的概念标准流 总结 前言 C语言可以直接操作文件&#xff0c;如果你是第一次听说这个特性&#xff0c;可能会眼前一亮&#xff0c;感到惊奇  …

jwt认证课件讲解

JWT 基本概念 在用户登录后&#xff0c;我们需要在不同请求之间记录用户的登录状态&#xff0c;常用方式一般有三种&#xff1a;Cookie&#xff0c;Session和Token。 这里我们使用第三种Token令牌方式来实现认证鉴权&#xff0c;采用Json Web Token认证机制&#xff08;简称…

继电器原理及应用

目录 前言 继电器 1.继电器配图 2.继电器原理图 3.继电器的使用 1-继电器的使用意义 2-继电器使用场景 继电器的简单使用 1.使用原理及接线 2.使用思考 3.代码实现 总结 前言 我们上节已经简单了解了震动传感器的使用(不懂的直接去看&#xff1a;震动传感器)&#xff…

【单例模式】

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。 一、实现方式 1. 饿汉式 在类加载的时候就创建实例&#xff0c;无论是否使用&#xff0c;实例都会被创建。优点是实现简单&#xff0c;线程安全。缺点是可能造成资源浪费&#xff0c;而程序可能不一定会使用这个实例…

21 基于51单片机的隧道车辆检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 以AT89C51单片机为控制核心&#xff0c;实现对隧道环境的监测。采用模块化设计&#xff0c; 共分以下几个功能模块&#xff1a; 单片机最小系统模块、电源模块、气体传感模块、和显示模块等。 通过…

Yocto - 使用Yocto开发嵌入式Linux系统_08 掌握软件包相关功能

Assimilating Packaging Support 本章介绍了解 Poky 和 BitBake 打包相关方面的关键概念。我们将了解支持的二进制包格式、共享状态缓存、包版本控制组件、如何设置和使用二进制包馈以支持我们的开发流程等。 This chapter presents the key concepts for understanding the as…

Pikachu-Sql-Inject - 通过sql进行远程服务器控制(试验)

secure_file_priv是MySQL中的系统变量&#xff0c;用于限制文件的读取和写入。 查看命令&#xff1a; show variables like "secure%" //或者 select secure_file_priv; 1.secure_file_priv NULL &#xff0c;限制文件的读取和写入。 2.secure_file_priv 文件路…