【二分算法】-- x的平⽅根(easy)
文章目录
- 1. 题目
- 2. 题目解析
- 3. 代码
1. 题目
在线oj
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
2. 题目解析
我们假设ret那个位置就是我们要返回的结果。
此时,我们就可以将其分成两个区间,左边是平方后<=x的,右边是平方后<x的。这就是这道题中的二段性。
- mid * mid <= x:left = mid
- mid * mid > x :right = mid - 1
3. 代码
/**
* 由于数据比较大,在计算mid * mid时,
* 有可能会出现溢出的情况,所以要将数据类型修改成long类型
* @param x
* @return
*/
public int mySqrt(int x) {
//由于x 可能是小于1的,所以那么[1,x]这个区间可能会不存在
//所以进行单独处理
if (x < 1){
return 0;
}
long left =1;
long right = x;
while (left < right){
long mid = left + (right - left + 1) / 2;
if (mid * mid <= x){
left = mid;
}else{
right = mid - 1;
}
}
return (int) left;
}