【优选算法】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,梳理出通用解题模板。二分算法的核心在于精准判断区间二段性、灵活调整边界。算法学习没有捷径,唯有坚持刷题、复盘总结,不断打磨思维与细节,突破解题瓶颈,日积月累终会实现能力跃迁,遇见更优秀的自己。

相关推荐
rimydu1974art1 小时前
# OpenCheck 废标风控系统技术实现
数据结构
山荷枝1 小时前
04-框架--SpringBoot
java·spring boot·后端
linux修理工1 小时前
内存占用 99% 且 Java 程序较多的优化建议
java·开发语言
前端 贾公子1 小时前
第08章:中间件(1)
python
weixin_460443561 小时前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库
Sylvia33.1 小时前
篮球数据API的技术架构与工程实践:基于火星数据WebSocket实时推送体系
java·python·websocket·网络协议·架构
Hi李耶2 小时前
【LeetCode】15.三数之和
java·算法·leetcode
DogDaoDao2 小时前
【第10篇】Python 异常处理与调试入门
python·深度学习·ai·程序员·大模型·异常处理与调试
蔬菜_2 小时前
前端转全栈-day6(构造函数与继承)
java