一、题目描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。
二、题解
(1) 枚举
/**
* 枚举:
* 执行用时 32ms 击败了 5.8% 的java用户
* 内存消耗 MB 击败了 % 的java用户
* @param x
* @return
*/
public int mySqrt1(int x) {
if(x < 1) return 0;
// 任何一个数的平方根都小于等于它的二分之一加一
for (long i = 0; i <= (x>>>1) + 1; i++) {
if(i*i <= x && (i+1)*(i+1) > x)
return (int)i;
}
return -1;
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
(2) 二分查找
/**
* 二分查找:
*
* 执行用时 ms 击败了 % 的java用户
* 内存消耗 MB 击败了 % 的java用户
* @param x
* @return
*/
public int mySqrt(int x) {
// 如果l初始值Wie1,则不用考虑r要取右中数的问题。
long l = 0;
long r = (x>>>1) + 1;
while (l < r) {
long mid = (l+r+1) >>> 1;
// 因为返回的是l,所以这里的if、else不能互换位置,比如:当x==1时,
// l == 0,r == 1
// mid == 1;
// 1 * 1 = 1,故l=1;
// 1 < 1 不成立退出循环
/*如果互换了if、else的位置,那么
* 1*1 = 1,r = mid-1 == 0。
* 退出循环,返回l==0 */
if(mid * mid > x)
r = mid-1;
else
l = mid;
}
return (int)l;
}
来源:CSDN
作者:Hoji Pan
链接:https://blog.csdn.net/qq_43539599/article/details/103970897