跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

二分查找实战:x 的平方根与搜索插入位置解析

二分查找在求平方根与有序数组插入位置中的应用。针对 x 的平方根,利用单调性确定满足条件的最大整数,注意 mid 计算时的类型转换防止溢出。对于搜索插入位置,通过比较中间值与目标值调整左右边界,最后处理目标值大于所有元素时的边界情况。代码采用 C++ 实现,包含必要的空数组检查与索引边界保护。

蜜桃汽水发布于 2026/3/23更新于 2026/5/77 浏览
二分查找实战:x 的平方根与搜索插入位置解析

二分查找实战:x 的平方根与搜索插入位置

二分查找是算法面试中的高频考点,核心在于利用数据的单调性将时间复杂度优化至 O(log n)。今天我们来深入探讨两个经典题目:求整数平方根和有序数组的插入位置。

1. x 的平方根

问题描述

给定一个非负整数 x,计算并返回其算术平方根的整数部分。小数部分将被舍去。

示例图

解题思路

设 x 的平方根结果为 index。观察 index 左右两侧的特性:

  • 区间 [0, index] 内的元素,平方后均小于等于 x;
  • 区间 [index+1, x] 内的元素,平方后均大于 x。

这种单调性非常适合使用二分查找。我们需要找到满足 mid * mid <= x 的最大 mid 值。

注意: 在计算 mid 时,为了防止溢出,通常采用 left + (right - left) / 2 的方式。此外,当 right = INT_MAX 时,right - left + 1 可能超出 int 范围,因此需要强转为 long long。

C++ 实现

class Solution {
public:
    int mySqrt(int x) {
        int left = 0;
        int right = x;
        while(left < right) {
            // 向上取整,避免死循环
            int mid = left + ((long long)right - left + 1) / 2;
            if((long long)mid * mid <= x) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
};

流程解析

流程图

代码中 mid 的计算使用了 (right - left + 1),这是为了配合 left = mid 的逻辑。如果向下取整且 left = mid,当 left 和 right 相邻时(如 3 和 4),mid 会一直等于 3,导致死循环。向上取整则能确保区间缩小。


2. 搜索插入位置

问题描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

示例图

解题思路

我们需要找到一个位置 index,使得该位置左侧的元素都小于 target,右侧的元素都大于等于 target。

设定左边界 left 和右边界 right。根据中间值 nums[mid] 与 target 的比较结果调整边界:

  • 若 nums[mid] >= target:说明 mid 落在 [index, right] 区间内,mid 本身可能是结果,或者结果在 mid 左侧。此时新 right 设为 mid。
  • 若 nums[mid] < target:说明 mid 落在 [left, index-1] 区间内,结果一定在 mid 右侧。此时新 left 设为 mid + 1。

当 left == right 时,循环结束,此时的 left 即为所求位置。但需注意一种特殊情况:如果 target 大于数组中所有元素,上述逻辑收敛到的 left 会是最后一个元素的索引,实际应返回 size。

C++ 实现

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        if (nums.empty()) return 0; // 处理空数组情况
        int left = 0;
        int right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] >= target) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        // 如果 target 大于数组最大值,插入位置应为末尾
        if(target > nums[nums.size() - 1]) {
            return left + 1;
        }
        return left;
    }
};

流程解析

流程图

这里的关键在于理解 while(left < right) 的终止条件。当区间长度为 1 时循环停止,此时 left 指向的是第一个大于等于 target 的位置。如果 target 比所有数都大,循环结束后 left 指向最后一个元素,所以需要额外判断是否加 1。


总结

这两道题都是二分查找的典型应用。第一题重点在于处理整数溢出和防止死循环的 mid 取值策略;第二题则考察对边界条件的敏感度,特别是目标值位于数组两端的情况。掌握这些细节,才能在面试中写出健壮的代码。

目录

  1. 二分查找实战:x 的平方根与搜索插入位置
  2. 1. x 的平方根
  3. 问题描述
  4. 解题思路
  5. C++ 实现
  6. 流程解析
  7. 2. 搜索插入位置
  8. 问题描述
  9. 解题思路
  10. C++ 实现
  11. 流程解析
  12. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • TCP 协议详解:报文结构、连接管理与流量控制
  • 开源大模型详解与实操部署:Mistral、Gemma、Llama、Qwen
  • ChatGPT vs. 文心一言 vs. 通义千问:中文创作能力深度评测
  • DeepSeek-R1 本地部署硬件配置与场景指南
  • 25 个降低 AI 检测率的提示词技巧
  • Qwen3-4B-Instruct 模型本地 CPU 部署与 WebUI 配置
  • Android WebRTC 视频通话开发实战:AI 优化与避坑指南
  • 计算机技能如何助力职业拓展与转型
  • DeepSeek 各版本说明与优缺点分析
  • VLA 机器人技术演进:10 篇视觉 - 语言 - 动作模型核心论文解析
  • XLeRobot VR 控制系统搭建与 Quest3 实操指南
  • Git 使用指南:从安装到远程仓库推送
  • Java 服务端核心技术面试核心知识点清单
  • AI 在医疗领域的十大应用场景
  • OpenClaw Web 控制台使用全解析:可视化配置与监控
  • Claude Code 完美平替方案:OpenCode 与 GitHub Copilot 组合使用
  • 新版 llama.cpp 使用及本地部署 LLaMA
  • Web 端即时通讯聊天的三种加密算法实现方案
  • MySQL 视图定义、操作及用户权限管理
  • RTEMS 项目贡献指南:创建与提交 Patch 流程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online