import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param x int整型
* @return int整型
*/
public int mysqrt (int x) {
// 边界情况:x为0或1时,平方根就是自身
if (x == 0 || x == 1) {
return x;
}
// 二分查找的范围:left从0开始,right最大为x(实际√x一定≤x,缩小范围可设为x/2,但x=2时x/2=1更合理)
int left = 0;
int right = x;
// 循环二分查找(左闭右闭区间 [left, right])
while (left <= right) {
// 计算中间值(避免 left + right 溢出,用 left + (right - left)/2 等价于 (left + right)/2)
int mid = left + (right - left) / 2;
// 计算 mid²(用long存储,避免int溢出,例如x=2^30时,mid可能接近2^15,mid²约2^30,超过int范围)
long square = (long) mid * mid;
if (square == x) {
// 找到精确平方根,直接返回
return mid;
} else if (square < x) {
// mid² < x:说明可能存在更大的符合条件的数,搜索右半区间
left = mid + 1;
} else {
// mid² > x:说明需要找更小的数,搜索左半区间
right = mid - 1;
}
}
// 循环结束时,left > right,此时right是最大的满足 right² ≤ x 的整数
return right;
}
}
思路:二分法 解决



京公网安备 11010502036488号