二分查找实战: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;
}
};
流程解析





