今日感受:💪 (ง •_•)ง 💪
题目描述:
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
解题代码如下
使用语言:Java; 时间复杂度:O(logn)
class Solution {
/**
二分法
*/
public int mySqrt(int x) {
//设置二分区间
int l = 0; int r = x;
//判断更新边界(l = r 时候就找到了)
while(l<r){
//二分中间
int mid = (l+r+1)/2;
//计算x的平方根 when x = mid * mid (mid = x Sqrt)
//判断更新边界
if(mid <= x / mid){
l = mid;
}else{
r = mid-1;// 保留的是x的整数范围所以xSqrt可能等于mid-1
}
}
return r; //x平方取整数的范围在左半部分,因此最后结果的到的是右边界的点
}
}
解题思路:
(1)确定区间二分区间范围: x的平方根的向下取整肯定小于等于x(等于x 的情况:x=1)
二分区间范围 [l,r] ; (l=0;r=x)
(2)判断更新条件 :在l = r 的时候即找到了x的平方根的向下取整值(int)。再此之前只要l<r 就进行二分更新,直到在l = r 的时候即找到了x的平方根的向下取整值。
(3)根据条件判断更新边界点
(4)结束循环条件 l = r 的时候,即找到了唯一一个点满足 mid = x / mid 的点,返回 r 值