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

《算法闯关指南:优选算法--二分查找》--23.寻找旋转排序数组中的最小值,24.点名
在这里插入图片描述

🔥草莓熊Lotso:个人主页
❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:

在这里插入图片描述

文章目录


前言:

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

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++算法代码:

classSolution{public:intfindMin(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++算法代码:

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

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

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


我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:腾讯云开发者社区

Read more

C++ 继承入门(上):从基础概念定义到默认成员函数,吃透类复用的核心逻辑

C++ 继承入门(上):从基础概念定义到默认成员函数,吃透类复用的核心逻辑

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 前言 一. 继承的概念与定义   1、继承的核心概念   2、继承的定义格式   3、继承方式与成员访问权限 二. 基类与派生类的转换:子类对象能当父类用吗? 三. 继承中的作用域:同名成员会冲突吗?   1、变量隐藏   2、函数隐藏 四、派生类的默认成员函数:构造、拷贝、析构怎么写?   1、构造函数:先调用父类构造,再初始化子类成员   2、拷贝构造:先拷贝父类,再拷贝子类   3、 赋值重载:

By Ne0inhk
华为OD技术面八股文_C++_01

华为OD技术面八股文_C++_01

文章目录 * C语言和C++的区别 * C++11引入哪些新特性 * 什么是面向对象?面向对象的三大特性 * malloc和new的区别 * delete和free的区别 * delete和delete[]的区别 * 什么是虚函数?什么是纯虚函数 * 什么是虚函数表?什么是虚函数指针? * 介绍一下虚函数实现机制 * 构造函数和构析函数能不能写为虚函数,为什么 * 说一下构造、析构函数的调用顺序 C语言和C++的区别 1. C++有新增的关键字和语法,还允许自定义命名空间。 2. C++新增类的概念,C语言中只有struct的概念。C++中添加访问权限概念,struct 的默认访问权限和继承权限都是 public,但是 class 的默认访问权限和默认继承权限都是 private. 3. C++引入了类、封装、继承、多态、模板、重载、异常处理机制等特性。而C没有 4.

By Ne0inhk

C++:模拟键盘鼠标(附带源码)

一、项目背景详细介绍 在实际工程中,我们经常需要让程序像“人”一样操作电脑: * 自动化测试:点击按钮、输入文本 * 运维/工具:批量操作 GUI 程序 * 辅助工具:快捷操作、脚本化流程 * 教学实验:理解 OS 输入事件链路 这些需求的核心,都是: 程序如何向操作系统“注入”键盘与鼠标输入事件? 1. Windows 输入系统的基本认知 Windows 中,键盘和鼠标并不是直接“给应用”的,而是: 硬件 → 驱动 → 系统输入队列 → 消息分发 → 窗口 只要我们向系统输入队列提交合法事件,系统就会像处理真实硬件一样处理它。 2. 常见实现方式对比 方式特点是否推荐keybd_event / mouse_event老 API❌ 已过时SendInput官方推荐✅

By Ne0inhk
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用

《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 🌟心向往之行必能至 🎥Cx330🌸的简介: 目录 前言: 一、理解二叉搜索树 1.1  二叉搜索树的概念 1.2 核心特性 1.2.1  多元化的结构: 灵活的数据结构 1.2.2  天然的搜索优势:擅长搜索的数据结构 二、二叉搜索树性能分析 2.1  时间复杂度分析 2.2  二分查找的局限性 三、实现二叉搜索树的定义 3.1  命名规范 3.2  定义节点

By Ne0inhk