1. 力扣69题:x的平方根解法全解析
这道看似简单的题目实际上考察了算法设计中的多个关键点:边界条件处理、数值溢出预防、算法效率优化等。作为一道经典的二分查找练习题,它完美展现了如何用O(log n)时间复杂度解决原本需要O(n)的问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题重述与理解
2.1 题目要求
我们需要实现一个函数,给定非负整数x,返回x的算术平方根的整数部分。例如:
- 输入4,输出2
- 输入8,输出2(因为2.828...取整)
特别限制:不能使用内置的指数函数或运算符(如pow()或**)。
2.2 关键约束分析
- 整数结果:只需要返回整数部分,不需要小数精度
- 非负输入:x的范围是0到2³¹-1(2147483647)
- 禁用内置函数:必须自己实现平方根计算逻辑
3. 解法一:二分查找法
3.1 算法思路
二分查找是解决此类"在有序范围内查找特定条件值"问题的利器。对于平方根问题,我们可以利用以下性质:
- 平方根结果一定在[0, x]区间内
- 区间内的数值是有序的
- 可以通过比较mid²与x的大小关系来缩小搜索范围
3.2 实现细节
java复制public int mySqrt(int x) {
if (x < 2) return x; // 处理0和1的情况
int left = 1, right = x;
while (left <= right) {
int mid = left + (right - left) / 2; // 防止溢出
long square = (long)mid * mid; // 转为long防止int溢出
if (square == x) {
return mid;
} else if (square < x) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return right; // 循环结束时right是最大的满足条件的整数
}
