【优选算法】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] 上。因此,更新 rightmid 位置,继续查找。
  • nums[mid] < target 时,说明 mid 落在了 [left, index - 1] 区间上,mid 右边但不包括 mid 本身,可能是最终结果,所以我们接下来查找的区间在 [mid + 1, right] 上。因此,更新 leftmid + 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,梳理出通用解题模板。二分算法的核心在于精准判断区间二段性、灵活调整边界。算法学习没有捷径,唯有坚持刷题、复盘总结,不断打磨思维与细节,突破解题瓶颈,日积月累终会实现能力跃迁,遇见更优秀的自己。

相关推荐
小鹿的周先生13 分钟前
Spring-AI-第2篇-ChatClient 实战:使用 DeepSeek 完成第一次 AI 对话
java·人工智能·spring
青梅味猪大肠21 分钟前
【深入浅出C++】为什么虚表指针可以解决菱形继承
开发语言·c++
潘潘的嵌入式日记32 分钟前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
悲且狂33 分钟前
SpringBoot项目改造注意事项(旧项目框架复用)
java·spring boot·后端
Lhan.zzZ1 小时前
QML 组件库:VS2022 + Qt 静态库方案
开发语言·c++·qt·visual studio
花间相见1 小时前
【LangChain组件03】—— LangChain Agents 执行与状态:工作流程与状态管理实战
java·前端·langchain
敲代码的嘎仔1 小时前
28届后端开发-海康威视日常实习一面(已OC)
java·开发语言·后端·面试·海康威视·实习·大厂
xx~t2 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
谢白羽2 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
程序员黎剑3 小时前
Spring-Bean生命周期-构造器访问Autowired字段为null
java·后端·spring