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

embedded/2024/10/9 3:12:01/

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

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

🔥专栏算法笔记


文章目录

  • 算法笔记】二分算法原理的深度剖析
    • 前言
    • 一.二分查找
      • 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.ppmy.cn/embedded/124852.html

相关文章

51.哀家要长脑子了!

1.P1003 [NOIP2011 提高组] 铺地毯​​​​​​ 重复 模拟 要求覆盖在最上面的地毯编号&#xff0c;用四个数组abgk分别记录地毯起点的左下角横纵坐标&#xff0c;地毯的长度宽度&#xff0c;输入的坐标x y 当它满足大于等于左下角坐标 并且 小于等于 地毯左下角横纵坐标的时候…

基于Word2Vec和LSTM实现微博评论情感分析

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

HTTP协议:连接世界的语言 —— Python中的实践与探索

在互联网时代&#xff0c;我们每天都在与HTTP协议打交道&#xff0c;从访问网站到发送邮件&#xff0c;从在线购物到社交媒体互动&#xff0c;几乎每一项网络活动的背后都有HTTP的身影。然而&#xff0c;对于许多开发者而言&#xff0c;HTTP协议仍然是一个既熟悉又陌生的存在。…

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…

Docker搭建一款开源的文档管理系统

1.系统介绍 Wizard是一款开源的文档管理系统&#xff0c;它支持多种格式类型的文档管理&#xff0c;包括Markdown、Swagger和Table&#xff0c;以适应不同场景和需求下的文档管理需求。 1.1功能特点 开源免费&#xff1a;Wizard是一款完全免费的开源项目&#xff0c;用户可以…

2024年中国研究生数学建模什么时候出成绩(附避坑指南)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 今年的华为杯已经于2024年9月20日——2024年9月25日完成&#xff0c;相信大家下…

【C++ 11】nullptr 空指针

文章目录 【 0. 问题背景 】0.1 野指针和悬空指针0.2 传统空指针 NULL0.3 传统空指针的局限性 【 1. 基本用法 】【 2. nullptr 的应用 】2.1 nullptr 解决 NULL 的遗留BUG2.2 简单实例 【 0. 问题背景 】 0.1 野指针和悬空指针 总结 野指针悬空指针产生原因指针变量未被初始…