算法思想总结:二分查找算法

                                             创作不易,感谢三连!! 

一、二分查找算法思路总结

大家先看总结,然后再根据后面的题型去慢慢领悟

二、二分查找(easy)

. - 力扣(LeetCode)二分查找

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

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;if(nums[mid]<target)  left=mid+1;else if(nums[mid]>target)  right=mid-1;else return mid;}return -1;}
};

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

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

 要注意示例3提到的边界情况!!

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

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target){if(nums.size()==0)  return {-1,-1};//处理边界情况,否则会越界int begin=0;//区间左端点int left=0,right=nums.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[mid]<target) left=mid+1;else right=mid;//最后会落在区间的左端点}if(nums[left]!=target) return{-1,-1};//找不到else begin=left;//区间右端点right=nums.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(nums[mid]<=target) left=mid;//最后会落在区间的右端点else right=mid-1;}return {begin,right};//此时至少有一个左端点,所以不可能找不到。}
};

四、x的平方根

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

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

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

 五、搜索插入位置

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

思路1:左端区间查找 

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

思路2:右端区间查找(有特殊情况,比如正好是和targe相等且只有一个元素

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int 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;}//右端区间要考虑边界情况(特殊情况,只有一个元素且正好等于target)if(nums[left]>=target) return left;return left+1;}
};

 六、山峰数组峰顶的索引

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

本题特别的就是不再是升序,而是去找二段性的规律

思路1:左端区间查找 

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;}
};

思路2:右端区间查找 

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;}
};

七、寻找峰值

. - 力扣(LeetCode)寻找峰值

 左区间端点法:

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 right;}
};

右区间端点法:

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

 八、点名

. - 力扣(LeetCode)点名

左区间端点法 

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

注意:插入元素的时候要注意是否是在最右边插入!

九、 寻找旋转数组中的最小值

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

思路:左区间端点查找法

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

十、二分查找规律的再总结

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

  

     后面有遇到相关oj题博主会继续更新的……感谢支持!!

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

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

相关文章

每日学习笔记:C++ STL 的forward_list

定义 特点 操作函数 元素查找、移除或安插 forward_list::emplace_after arg...指的是元素构造函数的参数&#xff08;0~N个&#xff09; #include <iostream> #include <memory> #include <list> #include <forward_list> using namespace std;class…

海思3516将BT1120改BT656输出大小为720*576

sample_comm_vi.c结构体 VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX {/* interface mode */VI_MODE_BT656,/* multiplex mode */VI_WORK_MODE_1Multiplex,/* r_mask g_mask b_mask*/{0xFF0000, 0x0},//掩码根据自己实际写/* progess…

基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

如何有效避免团队内耗,提升团队整体效能

团队内耗是一个普遍存在的问题&#xff0c;它可能导致工作效率低下、沟通不畅、成员间的信任缺失&#xff0c;甚至可能导致整个团队的崩溃。 它可能源于成员间的误解、利益冲突&#xff0c;或是个人情绪的波动。 如何避免团队内耗&#xff0c;是每个团队管理者和成员都应该关…

新质生产力

新质生产力是以科技创新为引擎&#xff0c;以新产业为主导&#xff0c;以产业升级为方向&#xff0c;以提升核心竞争力为目标的生产力。它融合人工智能、大数据等数字技术&#xff0c;更强调内在的发展质量&#xff0c;旨在走出一条生产要素投入少、资源配置效率高、资源环境成…

java组合模式揭秘:如何构建可扩展的树形结构

组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示整体/部分层次结构。组合模式使得客户端可以统一对待单个对象和组合对象&#xff0c;从而使得客户端可以处理更复杂的结构。 组合模式的主要组成部分包括&…

在Linux/Ubuntu/Debian中测试USB驱动器(U盘)的速度

如果你想测试USB驱动器的速度&#xff0c;可以使用各种工具和命令来测量读写速度。 用于此目的的一个常用工具是“dd”。 以下是如何使用“dd”执行简单的速度测试&#xff1a; 测试写入速度&#xff1a; 打开终端。 使用以下命令将测试文件写入 USB 驱动器&#xff1a; dd i…

人工智能|机器学习——BIRCH聚类算法(层次聚类)

这里再来看看另外一种常见的聚类算法BIRCH。BIRCH算法比较适合于数据量大&#xff0c;类别数K也比较多的情况。它运行速度很快&#xff0c;只需要单遍扫描数据集就能进行聚类。 1.什么是流形学习 BIRCH的全称是利用层次方法的平衡迭代规约和聚类&#xff08;Balanced Iterative…

LeetCode 2789.合并后数组中的最大元素:贪心(倒序)

【LetMeFly】2789.合并后数组中的最大元素&#xff1a;贪心&#xff08;倒序&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/ 给你一个下标从 0 开始、由正整数组成的数组 nums 。 你可以在数组上…

selenium启用MS Edge浏览器/下载MS Edge WebDriver

Selenium 是一个用于自动化 web 浏览器的工具&#xff0c;可以用于测试 web 应用程序或执行特定 web 任务。要在 Python 中使用 Selenium 来控制 Edge 浏览器&#xff0c;您需要安装相应的 Selenium 包和 Edge 驱动程序&#xff0c;并编写相应的 Python 代码。# 创建 selenium …

Prompt Engineering(提示工程)

Prompt 工程简介 在近年来&#xff0c;大模型&#xff08;Large Model&#xff09;如GPT、BERT等在自然语言处理领域取得了巨大的成功。这些模型通过海量数据的训练&#xff0c;具备了强大的语言理解和生成能力。然而&#xff0c;要想充分发挥这些大模型的潜力&#xff0c;仅仅…

【计算机视觉】目标跟踪| 光流算法详细介绍|附代码

0、前言 在上篇文章中https://blog.csdn.net/Yaoyao2024/article/details/136625461?spm1001.2014.3001.5501&#xff0c;我们对目标跟踪任务和目标跟踪算法有了大致的了解。今天我们就来详细介绍一下其中的生成式算法的一种&#xff1a;光流法。 在介绍光流法之前&#xff…

SinoDB V16.8 版本新特性

1、Oracle兼容 兼容 with as 语法 兼容 insert all/first 语法 兼容 () 形式的左外连接和右外连接语法 兼容 ROLLUP/CUBE/GROUPING SETS 语法 兼容 create or replace view/trigger/procedure/function/index 语法 兼容 rename procedure/function 语法 2、新增功能 条…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法&#xff1a; 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error &#xff1a;3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件&#xff1a;…

《BERT基础教程:Transformer大模型实战》读书笔记

概念 BERT&#xff0c;Bidirectional Encoder Representations from Transformers&#xff0c;多Transformer的双向编码器表示法。 RNN&#xff0c;recurrent neural network&#xff0c;循环神经网络。 LSTM&#xff0c;long short-term memory&#xff0c;长短期记忆网络。…

python类中的def __next__(self):有什么用

在Python中&#xff0c;__next__ 方法是一个特殊方法&#xff0c;它用于实现迭代器协议。当一个对象定义了 __next__ 方法时&#xff0c;这个对象就变成了一个迭代器。迭代器允许你在一个序列&#xff08;比如列表、元组或集合&#xff09;或其他可迭代对象上进行迭代&#xff…

Linux网络配置修改hosts映射文件关闭防火墙

Linux网络配置&系统管理 一、物理机、VMware软件、虚拟机之间的网络关系1.1 总体框架图1.2 为什么物理机、VM软件、客户机之间能够通信?1.3 查看客户机的IP地址ifconfig1.4 小节1.5 修改静态IP地址1.6 测试能不能ping通 二、修改主机名以及hosts映射文件2.1 修改主机名2.1…

机器视觉学习(二)—— 显示图像和视频

一、获取图像 要使用OpenCV获取图像&#xff0c;你需要安装OpenCV库并学习基本的OpenCV函数。下面是一些获取图像的基本步骤&#xff1a; 导入必要的库&#xff1a;import cv2 读取图像&#xff1a;image cv2.imread("image.jpg") 这将从指定路径读取图像&#xf…

什么是事件冒泡?Littlevgl中的事件冒泡是怎么样的?

什么是事件冒泡?Littlevgl中的事件冒泡是怎么样的&#xff1f; 事件冒泡(Event Bubbling)是指当一个元素上的事件被触发时&#xff0c;该事件会从最底层的元素开始逐级向上传播&#xff0c;直到最顶层的元素(通常是文档对象)被触发。 ​ 例如我们点击一个按钮时&#xff0c;…

前后端分离项目环境搭建

1. 使用到的技术和工具 springboot vue项目的搭建 工具 idea&#xff0c;mavennodejs 2. 后端框架搭建 利用maven创建springboot项目 3. 前端项目搭建 1. 安装相关工具 nodejs&#xff1a; 一个开源、跨平台的 JavaScript 运行时环境&#xff0c;可以理解成java当中需要…