【优选算法必刷100题】第019~20题(二分查找算法):x 的平方根、搜索插入位置

【优选算法必刷100题】第019~20题(二分查找算法):x 的平方根、搜索插入位置

🔥艾莉丝努力练剑:个人主页

专栏传送门:《C语言》《数据结构与算法》C/C++干货分享&学习过程记录Linux操作系统编程详解笔试/面试常见算法:从基础到进阶

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬艾莉丝的简介:


🎬艾莉丝的算法专栏简介:


目录

019  x 的平方根

1.1  思路一:暴力解法

1.1.1  算法思路

1.1.2  算法实现

1.2  思路二:二分查找

1.2.1  算法思路

1.2.2  算法实现

1.3  博主手记

020  搜索插入位置

2.1  算法思路——二分查找

2.2  算法实现

2.3  博主手记

结尾



019  x 的平方根

力扣链接:69. x 的平方根

力扣题解链接:二分查找算法模版解决【x 的平方根 】问题

题目描述:

1.1  思路一:暴力解法

1.1.1  算法思路

依次枚举 [0,x] 之间的所有数 (这里没有必要研究是否枚举到x / 2还是x / 2 + 1。因为我们找到结果之后直接就返回了,往后的情况就不会判断。反而研究枚举区间,既耽误时间,又可能出错):

(1)如果i * i == x,直接返回;
(2)如果i * i > x,说明之前的一个数是结果,返回i - 1。

由于i * i可能超过int的最大值,因此使用 long long类型。

1.1.2  算法实现

代码演示如下——

class Solution { public: int mySqrt(int x) { // 由于两个较⼤的数相乘可能会超过 int 最⼤范围 // 因此⽤ long long long long i = 0; for (i = 0; i <= x; i++) { // 如果两个数相乘正好等于 x,直接返回 i if (i * i == x) return i; // 如果第⼀次出现两个数相乘⼤于 x,说明结果是前⼀个数 if (i * i > x) return i - 1; } // 为了处理oj题需要控制所有路径都有返回值 return -1; } };
时间复杂度:O(n),空间复杂度:O(1)。

1.2  思路二:二分查找

1.2.1  算法思路

设x的平方根的最终结果为index——

1、分析index左右两次数据的特点:

(1)[ 0 , index ] 之间的元素,平方之后都是小于等于x的;
(2)[ index + 1 , x] 之间的元素,平方之后都是大于的。

因此可以使用二分查找算法

1.2.2  算法实现

代码演示如下——

class Solution { public: int mySqrt(int x) { if(x < 1) return 0; // 处理边界情况 int left = 1,right = x; while(left < right) { long long mid = left + (right - left + 1) / 2; // 数据量大,类型改成long long更加合适,防溢出 if(mid * mid <= x) left = mid; else right = mid - 1; } return left; } };
时间复杂度:O(logn),空间复杂度:O(1)。

1.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


020  搜索插入位置

力扣链接:35. 搜索插入位置

力扣题解链接:二分查找模版解决【搜索插入位置】问题

题目描述:

2.1  算法思路——二分查找

1、分析插入位置左右两侧区间上元素的特点——
设插入位置的坐标为index,根据插入位置的特点可以知道:

(1)[left,index-1]内的所有元素均是小于target的;
(2)[index,right]内的所有元素均是大于等于target的。

2、设 left 为本轮查询的左边界,right为本轮查询的右边界。根据mid位置元素的信息,分析下一轮查询的区间:

(1)当nums[mid] >= target时,说明mid落在了[index , right]区间上,mid左边包括mid本身,可能是最终结果,所以我们接下来查找的区间在[left,mid]上。因此,更新right到mid位置,继续查找;

(2)当nums[mid] < target时,说明mid落在了([left , index - 1]区间上,mid右边但不包括mid本身,可能是最终结果,所以我们接下来查找的区间在[mid + 1 , right]上。因此,更新[left到mid+1的位置,继续查找。

3、到我们的查找区间的长度变为1,也就是left == right的时候,left 或者 right 所在的位置就是我们要找的结果。

2.2  算法实现

代码演示如下——

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; else return left; } };

left和right这里已经相遇了,返回left或者right都是可以的——

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[right] < target) return right + 1; else return right; } };
时间复杂度:O(logn),空间复杂度:O(1)

2.3  博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!


结尾

往期回顾:

【优选算法必刷100题】第018题(二分查找算法):在排序数组中查找元素的第一个和最后一个位置

结语:都看到这里啦!请大佬不要忘记给博主来个“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡

૮₍ ˶ ˊ ᴥ ˋ˶₎ა


Read more

75元!复刻Moji 2.0 小智 AI 桌面机器人,基于乐鑫ESP32开发板,内置DeepSeek、Qwen大模型

文末联系小编,获取项目源码 Moji 2.0 是一个栖息在你桌面上的“有灵魂的伴侣”,采用乐鑫 ESP32-C5开发板,配置 1.5寸 360x360 高清屏,FPC 插接方式,支持 5G Wi-Fi 6 极速连接,内置小智 AI 2.0 系统,主要充当智能电子宠物的角色,在你工作学习枯燥时,通过圆形屏幕上的动态表情包卖萌解压,提供情绪陪伴;同时它也是功能强大的AI 语音助手,支持像真人一样流畅的连续对话,随时为你查询天气、解答疑惑或闲聊解闷,非常适合作为极客桌搭或嵌入式学习的开源平台。 🛠️ 装配进化 告别手焊屏幕的噩梦。全新设计的 FPC 插座连接,排线一插即锁,将复刻门槛降至最低。 🚀 性能进化 主控升级为 ESP32-C5。支持 5GHz Wi-Fi 6,

By Ne0inhk

海尔智能家居集成:解锁全屋设备统一管理新体验

海尔智能家居集成:解锁全屋设备统一管理新体验 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 海尔智能家居集成插件为HomeAssistant用户提供了一套完整的设备接入方案,让您能够将家中的海尔设备无缝集成到统一的智能家居生态系统中。通过这个插件,您可以摆脱多个APP切换的烦恼,真正实现全屋设备的智能联动。 核心特性亮点 全面设备兼容 - 支持空调、热水器、窗帘、开关等8种设备类型,覆盖海尔智能设备的绝大多数使用场景。 云端数据同步 - 采用云端轮询技术,实时获取设备状态,确保控制指令的及时响应和状态更新的准确性。 多平台实体支持 - 提供开关、数字调节、选择器、传感器、温控器、热水器、窗帘等多种实体平台,满足不同设备的控制需求。 配置流程简化 - 通过图形化配置界面,用户只需简单几步即可完成设备接入,无需编写复杂代码。 快速安装部署 HACS便捷安装 对于已经安装HACS的用户,可以通过HACS界面搜索"

By Ne0inhk
【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!! **🔥个人主页:IF’Maxue-ZEEKLOG博客 🎬作者简介:C++研发方向学习者 📖**个人专栏: 《C语言》 《C++深度学习》 《Linux》 《数据结构》 《数学建模》** ⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行! 文章目录 * 一、先搞懂:我们要解决啥问题? * 二、核心计算:代码怎么判断“烟幕有没有用”? * 1. 先算单个烟幕的“有效时间段” * 2. 合并重叠的时间段(避免重复计算) * 3. 只算“导弹到达前”的有效时间 * 三、代码优化:加了2个实用功能,结果直接看 * 1. 跑完直接显示“最优遮蔽时长”

By Ne0inhk
GCC编译(6)静态库工具AR

GCC编译(6)静态库工具AR

GCC编译(6)静态库工具AR Author: Once Day Date: 2026年2月20日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 编译构建工具链_Once-Day的博客-ZEEKLOG博客 参考文章:ar(1) - Linux manual page【Linux】ar命令:用于创建、修改和提取静态库(archive)-ZEEKLOG博客Linux命令学习手册-ar - 知乎Linux ar命令介绍 和常用示例 - Link_Z - 博客园 文章目录 * GCC编译(6)静态库工具AR * 1. AR工具概述 * 1.1 背景介绍 * 1.2 基础使用

By Ne0inhk