news 2026/5/6 22:20:41

【算法】搜索插入位置 x的平方根

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法】搜索插入位置 x的平方根

算法场景

二分查找作为一种高效的查找算法,时间复杂度为O ( l o g n ) O(logn)O(logn)
,以下结合此文的「搜索插入位置」和「平方根求解」,来体验它的高效!


  • 算法场景
    • 一、搜索插入位置
      • 1.1 题目链接
      • 1.2 题目描述
      • 1.3 题目示例
      • 1.4 算法思路
      • 1.5 核心代码
      • 1.6 示例测试(总代码)
    • 二、x 的平方根
      • 2.1 题目链接
      • 2.2 题目描述
      • 2.3 题目示例
      • 2.4 算法思路
      • 2.5 核心代码
      • 2.6 示例测试(总代码)
  • 总结

一、搜索插入位置

1.1 题目链接

LeetCode_35搜索插入位置【点击进入】


1.2 题目描述

给定一个无重复元素的升序排列数组nums和一个目标值target,在数组中找到目标值并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。要求必须使用时间复杂度为O(log n)的算法。

1.3 题目示例

  • 示例 1:
    输入: nums = [1,3,5,6], target = 5
    输出: 2
  • 示例 2:
    输入: nums = [1,3,5,6], target = 2
    输出: 1
  • 示例 3:
    输入: nums = [1,3,5,6], target = 7
    输出: 4

1.4 算法思路

本题的核心是利用二分查找高效定位目标值的位置或插入点,关键在于把握「升序数组」的特性和边界条件的处理:

  1. 初始化搜索区间:左边界left = 0,右边界right = nums.size() - 1,覆盖整个数组范围。
  2. 二分查找核心循环:当left < right时,计算中间位置mid = left + (right - left) / 2(该写法可避免left + right溢出)。
    • nums[mid] < target:说明目标值在mid右侧,将左边界更新为mid + 1
    • 否则:说明目标值在mid左侧或等于nums[mid],将右边界更新为mid
  3. 循环结束后,leftright重合,此时需判断最终位置:
    • nums[left] < target:说明目标值大于数组所有元素,应插入到数组末尾,返回right + 1
    • 否则:目标值的位置或插入点即为right(与left相等)。

1.5 核心代码

classSolution{public:intsearchInsert(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1;while(left<right){intmid=left+(right-left)/2;if(nums[mid]<target)left=mid+1;elseright=mid;}if(nums[left]<target)returnright+1;returnright;}};

1.6 示例测试(总代码)

#include<iostream>#include<vector>usingnamespacestd;classSolution{public:intsearchInsert(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1;while(left<right){intmid=left+(right-left)/2;if(nums[mid]<target)left=mid+1;elseright=mid;}if(nums[left]<target)returnright+1;returnright;}};intmain(){// 示例 1 测试vector<int>nums1={1,3,5,6};inttarget1=5;Solution sol;cout<<"示例 1 输出:"<<sol.searchInsert(nums1,target1)<<endl;// 预期输出 2// 示例 2 测试vector<int>nums2={1,3,5,6};inttarget2=2;cout<<"示例 2 输出:"<<sol.searchInsert(nums2,target2)<<endl;// 预期输出 1// 示例 3 测试vector<int>nums3={1,3,5,6};inttarget3=7;cout<<"示例 3 输出:"<<sol.searchInsert(nums3,target3)<<endl;// 预期输出 4return0;}

二、x 的平方根

2.1 题目链接

LeetCode_60x的平方根【点击进入】


2.2 题目描述

给你一个非负整数x,计算并返回x的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。注意:不允许使用任何内置指数函数和算符(如pow(x, 0.5)x ** 0.5)。

2.3 题目示例

  • 示例 1:
    输入:x = 4
    输出:2
  • 示例 2:
    输入:x = 8
    输出:2
    解释:8 的算术平方根是 2.82842…,小数部分舍去后返回 2。

2.4 算法思路

本题本质是在「0 到 x」的整数区间内,查找最大的整数mid使得mid * mid <= x,同样适用二分查找,需重点处理边界和溢出问题:

  1. 边界情况处理:当x < 1时(即 x = 0),直接返回 0。
  2. 初始化搜索区间:左边界left = 0,右边界right = x(因为对于非负整数 x,其平方根一定不大于 x)。
  3. 二分查找核心循环:当left < right时,计算中间位置mid = left + (right - left + 1LL) / 2
    • 1LL是为了避免「死循环」:当区间收缩到[left, left+1]时,确保能正确移动左边界。
    • long long类型存储mid:防止mid * mid超出 int 范围导致溢出。
  4. 区间更新逻辑:
    • mid * mid <= x:说明mid可能是答案或答案在mid右侧,将左边界更新为mid
    • 否则:说明答案在mid左侧,将右边界更新为mid - 1
  5. 循环结束后,leftright重合,即为x算术平方根的整数部分。

2.5 核心代码

classSolution{public:intmySqrt(intx){// 处理边界情况if(x<1)return0;else{intleft=0;intright=x;while(left<right){longlongmid=left+(right-left+1LL)/2;// 溢出处理if(mid*mid<=x)left=mid;elseright=mid-1;}returnleft;}}};

2.6 示例测试(总代码)

#include<iostream>usingnamespacestd;classSolution{public:intmySqrt(intx){// 处理边界情况if(x<1)return0;else{intleft=0;intright=x;while(left<right){longlongmid=left+(right-left+1LL)/2;// 溢出处理if(mid*mid<=x)left=mid;elseright=mid-1;}returnleft;}}};intmain(){// 示例 1 测试intx1=4;Solution sol;cout<<"示例 1 输出:"<<sol.mySqrt(x1)<<endl;// 预期输出 2// 示例 2 测试intx2=8;cout<<"示例 2 输出:"<<sol.mySqrt(x2)<<endl;// 预期输出 2// 额外测试用例intx3=0;cout<<"x=0 输出:"<<sol.mySqrt(x3)<<endl;// 预期输出 0intx4=5;cout<<"x=5 输出:"<<sol.mySqrt(x4)<<endl;// 预期输出 2intx5=9;cout<<"x=9 输出:"<<sol.mySqrt(x5)<<endl;// 预期输出 3return0;}

总结

在本篇文章中,我们通过「搜索插入位置」与「x 的平方根」两个经典题目,深入理解了二分查找的核心思想与应用方式。

二分查找的核心价值在于将线性搜索的O(n)时间复杂度优化为O(log n),尤其适用于「有序区间」的查找问题。通过两道题的对比可以发现:

  • 二分查找的关键在于「确定搜索区间」和「区间更新规则」,需根据题目目标灵活调整(如查找目标值 vs 查找最大满足条件值);
  • 边界处理(如数组为空、x=0 等极端情况)和溢出防护(如用 long long 存储中间值)是二分查找实现的常见考点;
  • 虽然两道题的场景不同,但都利用了「有序性」和「区间收缩」的核心逻辑,体现了二分查找的通用性。

掌握二分查找的本质后,面对有序数组查找、数值逼近等问题时,都可以快速构建解题思路,高效解决问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 22:11:40

HoRain云--PHP类型比较终极避坑指南

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/5/6 22:09:42

如何用 cursor.continue 实现本地海量数据的分页查询加载

cursor.continue()实现分页的核心是游标递进定位而非跳过前N条&#xff0c;通过lastKey参数seek到指定键或更大键的下一条记录&#xff0c;配合索引顺序&#xff08;如倒序&#xff09;实现高效“下一页”加载&#xff0c;避免循环调用导致性能问题。用 cursor.continue() 实现…

作者头像 李华
网站建设 2026/5/6 22:05:11

如何快速掌握Android位置模拟:3步配置完整指南 [特殊字符]

如何快速掌握Android位置模拟&#xff1a;3步配置完整指南 &#x1f4cd; 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation Android位置模拟工具&#xff08;FakeLocation&#xff…

作者头像 李华