实现 int sqrt(int x)
函数,计算并返回 x 的平方根。
样例
sqrt(3) = 1
sqrt(4) = 2
sqrt(5) = 2
sqrt(10) = 3
挑战
O(log(x))
解题思路:
由于x平方根一定是小于等于x/2,所以可以看作在0-x/2的有序数组中寻找出一个满足条件的数,这个条件是:
mid*mid<=x && (mid+1)*(mid+1)>x
自然的就想到二分搜索,但是注意mid*mid这样的操作很容易溢出,所以这里改变一下形式:
mid<=x/mid && (mid+1)>x/(mid+1)
public class Solution {
/**
* @param x: An integer
* @return: The sqrt of x
*/
public int sqrt(int x) {
// write your code here
if(x == 0)
return 0;
int l = 1;
int r = 1 + x/2;
while(l < r){
int mid = (r-l)/2+l;
if(mid<=x/mid && (mid+1)>x/(mid+1))
return mid;
else if(mid > x/mid){
r = mid - 1;
}else{
l = mid + 1;
}
}
return l;
}
}
OR
public class Solution {
/**
* @param x: An integer
* @return: The sqrt of x
*/
public int sqrt(int x) {
// write your code here
if(x == 0)
return 0;
int l = 1;
int r = 1 + x/2;
int mid = 1;
while(l <= r){
mid = (r-l)/2+l;
if(mid<=x/mid && (mid+1)>x/(mid+1))
return mid;
else if(mid > x/mid){
r = mid - 1;
}else{
l = mid + 1;
}
}
return mid;
}
}