【优选算法】1.搜索插入位置 2.x的平方根

🔥小龙报:个人主页

🎬作者简介:C++研发,嵌入式,机器人,AI等方向学习者

❄️个人专栏:《优选算法》

✨ 永远相信美好的事情即将发生

文章目录

  • 前言
  • 一、搜索插入位置
    • 1.1题目
    • [1.2 算法原理](#1.2 算法原理)
      • [1.2.1 算法思路](#1.2.1 算法思路)
    • [1.3 代码](#1.3 代码)
  • 二、x的平方根
    • [2.1 题目](#2.1 题目)
    • [2.2 算法原理](#2.2 算法原理)
      • [2.2.1 算法思路](#2.2.1 算法思路)
      • [2.2.2 算法流程](#2.2.2 算法流程)
      • [2.2.2.1 思路一:暴力枚举](#2.2.2.1 思路一:暴力枚举)
        • [2.2.2.2 思路二: 二分查找](#2.2.2.2 思路二: 二分查找)
    • [2.3 代码](#2.3 代码)
  • 总结与每日励志

前言

二分查找是算法笔试面试中的高频基础考点,依托数组二段性可将时间复杂度优化至O(logN),高效解决有序数组检索问题。本文选取搜索插入位置、x的平方根两道经典入门例题,拆解二分算法核心逻辑与边界处理技巧,梳理不同场景下的解题思路,帮助大家夯实二分思维,掌握模板化解题方法,为后续复杂算法学习筑牢基础。


一、搜索插入位置

1.1题目

链接:搜索插入位置

1.2 算法原理

核心思想: 二分

1.2.1 算法思路

a. 分析插入位置左右两侧区间上元素的特点:

设插入位置的坐标为 index,根据插入位置的特点可以知道:

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

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

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

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

1.3 代码

csharp 复制代码
class Solution 
{
public:
    int searchInsert(vector<int>& nums, int target) 
    {
        int l = 0,r = nums.size() - 1;
        while(l < r)
        {
            int mid = (l + r) / 2;
            if(nums[mid] >= target)
                r = mid;
            else
                l = mid + 1; 
        }
        if(nums[l] < target)
            return l + 1;
        else
            return l;
    }
};

时间复杂度 : O(n)

二、x的平方根

2.1 题目

链接:x的平方根

2.2 算法原理

核心思想 :二段性 ->二分算法

2.2.1 算法思路

2.2.2 算法流程

2.2.2.1 思路一:暴力枚举

依次枚举 [0, x] 之间的所有数 i:

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

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

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


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

2.2.2.2 思路二: 二分查找

a. 分析 index 左右两次数据的特点:

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

2.3 代码

cpp 复制代码
class Solution 
{
public:
    int mySqrt(int x) 
    {
        if(x < 1)
            return 0;
        long long l = 1,r = x;
        while(l < r)
        {
            long long mid = (l + r + 1) / 2;
            if(mid * mid <= x)
                l = mid;
            else
                r = mid - 1;
        }
        return l;
    }
};

时间复杂度 : O(logN)

总结与每日励志

✨ 本文通过两道典型例题,系统讲解了二分查找的核心原理,区分了左右边界查找逻辑,规避了数值溢出、区间死循环等常见bug,梳理出通用解题模板。二分算法的核心在于精准判断区间二段性、灵活调整边界。算法学习没有捷径,唯有坚持刷题、复盘总结,不断打磨思维与细节,突破解题瓶颈,日积月累终会实现能力跃迁,遇见更优秀的自己。

相关推荐
INGNIGHT几秒前
486. 预测赢家(博弈dp/区间dp)
linux·c++
维克兜率天1 分钟前
【维克】统计套利:寻找市场的“定价误差“
人工智能·python·算法
承渊政道5 分钟前
【Python编程—从入门到实践】(让程序记得、恢复并解释失败:Python 文件、异常与JSON系统教程)
开发语言·python·pycharm·json·异常处理
秋饼9 分钟前
Claude Haiku 5.5 + Spring AI 2.0 企业级低成本高并发 AI Agent 实战:子智能体分工、成本熔断与百万上下文落地
java·ai·技术分享·后端开发
aqiu11111112 分钟前
【C++算法打怪专栏】LeetCode 1. 两数之和(哈希表解法总结)
c++·算法·leetcode
郭庆汝18 分钟前
(六)MCP+A2A之——Playwright与BrowserUse:让AI学会像人类一样使用浏览器
开发语言·python
楚识科技21 分钟前
票据 OCR 识别技术深度解析:从算法原理到企业级落地实现
算法·ocr
longlongzihan22 分钟前
LeetCode 25. K 个一组翻转链表 (迭代+分组反转法)
算法·leetcode·链表
xuxigifxfh23 分钟前
牛客:BISHI8 大整数哈希
java·算法·哈希算法
Yolanda_202223 分钟前
26.网络模型的保存与读取
人工智能·pytorch·python