当前位置: 首页 > news >正文

《算法闯关指南:优选算法--二分查找》--23.寻找旋转排序数组中的最小值,24.点名

在这里插入图片描述

🔥草莓熊Lotso:个人主页

❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》

✨生活是默默的坚持,毅力是永久的享受!

🎬 博主简介:

在这里插入图片描述


文章目录

  • 前言:
  • 23. 寻找旋转排序数组中的最小值
    • 解法(二分查找):
      • 算法思路:
    • C++算法代码:
    • 算法总结&&笔记展示:
  • 24 .点名
    • 解法(二分查找):
      • 算法思路:
    • C++算法代码:
    • 算法总结&&笔记展示:
  • 结尾:


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。


23. 寻找旋转排序数组中的最小值

题目链接

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

题目描述
在这里插入图片描述

题目示例
在这里插入图片描述

解法(二分查找):

算法思路:

题目中的数组规则如下图所示:
在这里插入图片描述
其中 c 点就是我们要求的点。
二分的本质:找到一个判断标准,使得查找区间能够一分为二。
通过图像我们可以发现,【A,B】 区间内的点都是严格大于 D 点的值的,C 点的值是严格小于 D 点的值的。但是当 【C,D】 区间只有一个元素的时候,C 点的值是可能等于 D 点的值的。

因此,初始化左右两个指针 leftright
然后根据 mid 的落点,我们可以划分下一个查询的区间:

  • mid【A,B】 区间的时候,也就是 mid 位置的值严格大于 D 点的值,下一次查询区间在 【mid+1,right】 上;
  • mid【C,D】 区间的时候,也就是 mid 位置的值严格小于等于 D 点的值,下次查询区间在 【left,mid】 上。

当区间长度变成 1 的时候,就是我们要找的结果。

C++算法代码:

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

算法总结&&笔记展示:

笔记字有点丑,大家见谅:
在这里插入图片描述


24 .点名

题目链接

LCR 173. 点名 - 力扣(LeetCode)

题目描述
在这里插入图片描述
题目示例
在这里插入图片描述

解法(二分查找):

算法思路:

关于这道题中,时间复杂度为 O(N) 的解法有很多种,而且也都比较好想到,这里就不再赘述。本题我们主要介绍的是一个时间复杂度为 O(logn) 的最优解法二分法:
在这个升序的数组中,我们发现:

  • 在第一个缺失位置的左边,数组内元素都是与数组下标相等的;
  • 在第一个缺失位置的右边,数组内的元素都是与数组下标不相等的。

因此,我们可以利用这个 【二段性】 ,来使用 【二分查找】 算法。

C++算法代码:

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

算法总结&&笔记展示:

笔记字有点丑,大家见谅:
在这里插入图片描述


结尾:

🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:本文精选两道二分查找经典题型,通过图解与代码实现详解解题思路。旋转排序数组最小值:利用区间二段性,比较中点与右端点值,收缩查找范围至单个元素。缺失数字查找:根据元素值与下标关系二分,定位首个不匹配位置。笔记附手写解析,助你掌握二分核心思想——“以判断标准分割区间”,高效解决有序数据问题。

✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど

在这里插入图片描述

http://www.dtcms.com/a/523576.html

相关文章:

  • 【ssh密钥】--- 当密钥密码遇见 Git 服务器:一场关于 “信任” 的浪漫喜剧
  • kotlin 数据类的get和set 问题
  • 爱站网功能左旗网站建设
  • 中国企业跨境云组网指南:低延迟访问德国AWS云做数据分析的实操方案
  • 从单机阅读到云端协作:KoodoReader+cpolar构建知识管理新范式
  • 设计模式之:命令模式
  • EulerOS(NPU)安装llamafactory
  • Ubuntu卸载snap
  • STP(生成树协议)与 RSTP(快速生成树协议)核心知识
  • 数据结构:顺序表讲解(2)
  • 建设一个网站需要考虑什么海口h5公司
  • 高端广告公司网站建设wordpress插件 stock
  • 第二章、全局配置项目主题色(主题切换+跟随系统)
  • 彻底清理:Vue项目中移除static文件夹的完整指南
  • 【Linux网络】套接字Socket编程预备
  • day18_菜单查询 合并servlet
  • 算法总结篇(枚举-分治)
  • TCP pure ACK 的不可扩展性问题
  • Android16 Wifi打开到自动连接的主要日志过程分析介绍
  • 背包dp——动态规划
  • 找做柜子的网站中国芯片制造最新消息
  • 甘肃省临夏州建设局网站wordpress 未分类
  • 用 Excalidraw+cpolar 做会议协作,像素级还原实体白板体验
  • 使用C++开发Android .so库的优势与实践指南
  • Spring AOP:注解配置与XML配置双实战
  • 基于YOLO11深度学习的半导体晶圆外观缺陷检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】
  • 笔记本电脑待机、睡眠与休眠模式的技术差异解析
  • 2025丨时间很快,又来到1024
  • 基于python人脸识别系统 人脸检测 实时检测 深度学习 Dlib库 ResNet深度卷积神经网络 pyqt设计 大数据(源码)✅
  • 【C + +】unordered_set 和 unordered_map 的用法、区别、性能全解析