《算法闯关指南:优选算法--二分查找》--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

Java工业级缓存实战系列(一):多级缓存架构设计与落地(Redis客户端+Redisson全方案)

Java工业级缓存实战系列(一):多级缓存架构设计与落地(Redis客户端+Redisson全方案) * 前言 * 一、缓存核心认知与架构设计 * 1.1 缓存核心分类与价值 * 1.2 缓存三大核心问题(定义+业务影响) * 1.3 分布式缓存技术选型前提 * 二、本地缓存基础落地(Caffeine首选) * 2.1 主流本地缓存方案对比 * 2.2 工业级Caffeine配置与实战 * (1)统一常量类(系列共用,标准化配置) * (2)Caffeine配置类(Spring Bean管理,全局复用) * (3)本地缓存业务层封装(工业级规范) * 三、分布式缓存方案一:Redis原生客户端实现(Lettuce+Jedis) * 3.1 Redis客户端深度对比(Lettuce vs

By Ne0inhk

汉化版IDEA 更换 JDK 版本全教程,超详细!

汉化版IDEA 更换 JDK 版本全教程,超详细! 在 Java 开发中,我们经常需要根据项目需求切换不同的 JDK 版本(比如从 JDK8 升级到 JDK17,或降级到 JDK11)。对于使用汉化版 IntelliJ IDEA的小伙伴,本文全程采用中文菜单 / 选项描述,不改动任何非必要配置,手把手教你完成 JDK 切换,全程避坑! 一、场景 1:设置全局默认 JDK(所有新项目生效) * 若未打开任何项目:直接点击 IDEA 启动界面的「文件 → 新项目设置 → 新项目的结构」(2020 + 版本); * 若已打开项目:点击「文件 → 项目结构」。 1. 在弹出的「项目结构」窗口左侧,

By Ne0inhk
JAVA 异常处理:从原理到实战最佳实践

JAVA 异常处理:从原理到实战最佳实践

JAVA 异常处理:从原理到实战最佳实践 1.1 本章学习目标与重点 💡 掌握异常的分类与核心概念,理解异常处理的设计思想。 💡 熟练运用 try-catch-finally、throws、throw 处理异常。 💡 掌握自定义异常的编写与使用场景,规范异常处理流程。 ⚠️ 本章重点是 异常处理的最佳实践 和 避免常见误区,这是提升代码健壮性的核心技能。 1.2 异常的核心概念与分类 1.2.1 什么是异常 💡 异常是指程序运行过程中出现的非正常情况,它会中断程序的正常执行流程。 比如文件找不到、数组下标越界、空指针访问等,这些情况都会触发异常。 Java 中所有异常都是 Throwable 类的子类,异常处理的本质是捕获并处理这些非正常情况,保证程序可以继续运行或优雅退出。 1.2.2 异常的分类 Java 中的异常体系分为三大类,它们的父类都是 Throwable: * 是 JVM 内部的严重错误,

By Ne0inhk

JDK-18.0.2.1 Windows 64位安装与环境配置全攻略

JDK-18.0.2.1 Windows 64位安装与环境配置全攻略 1. 安装前准备:检查与卸载(可选但推荐) 在安装新版本的JDK之前,建议先检查电脑是否已经安装过其他版本的JDK,以避免版本冲突。 1. 检查现有JDK版本: 按下键盘上的 Win + R 键,输入 cmd 并回车打开命令提示符。在窗口中输入以下命令并回车:java -version 2. 分析结果: * 如果显示 java version "18.0.2.1" 或类似信息,说明系统已安装JDK。如果你希望保留或覆盖安装,可以跳过此步骤直接进入安装环节;如果你想全新安装,建议先卸载旧版本-5。 * 如果显示“‘java’ 不是内部或外部命令,也不是可运行的程序”,说明系统未安装JDK或环境变量未配置,可以直接进行安装步骤-7。 3. 卸载旧版本(

By Ne0inhk