69.x的平方根(二分查找) 难度:简单
题目描述:
实现 int sqrt(int x)
函数。
计算并返回 x
的平方根,其中 x
是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
考察的是二分查找:
二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n)
的数组,二分查找的时间复杂度为 O(log n)
。
我的思路:
一开始我没绕过来,这题花了很长时间,我都不敢相信这是easy难度的。
其实过程就是:取半 >>比较>>再取半>>比较,直到满足题意。
其实也属于双指针的一种情况,但是二分查找的复杂度要低很多。
我的Java代码:
class Solution {
public int mySqrt(int x) {
if (x == 0) {
return 0;
}
int l = 1,r = x,mid,sqrt;
while (l<=r){
mid = l + (r-l)/2;
sqrt = x/mid;
if(mid == sqrt){
return mid;
}else if (mid < sqrt) {
l = mid + 1;//画图理解一下为啥+1,下面为啥-1
}else{
r = mid - 1;
}
}
return r;//返回l会报错
}
}