题目:
给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。
正数的平方根有两个,只输出其中的正数平方根。
如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。
输入: x = 8
输出: 2
解释: 8 的平方根是 2.82842…,由于小数部分将被舍去,所以返回 2
输入: x = 4
输出: 2
分析:
假如输入的非负整数是n,从0开始每次增加1,对于每个整数m,判断m^2是否小于或等于n,如果找到一个m,并且满足m ^2 <=n 和(m+1) ^2>n,那么m就是n的平方根,这种操作的时间复杂度为O(n ^1/2)。
根据数学常识对于每个整数m,判断m^2是否小于或等于n,如果找到一个m,并且满足m ^2 <=n 和(m+1) ^2>n,就得到这个平方根,例如8的平方根是2,2的平方小于8并且2+1的平方大于8.可以采用二分查找法,时间复杂度为O(logn),具体见代码
代码:

public class MySqrt {
public int mySqrt(int n) {
//除0之外的平方根一定在从1到n的范围内
int left = 1;
int right = n;
while (left <= right) {
int mid = (left + right) / 2;
// mid*mid有可能会溢出,所以采用mid <=n/mid
if (mid <= n/mid) {
if ((mid + 1) > n/(mid+1)) {
//满足两个条件才返回
return mid;
}
left = mid + 1;
} else {
right = mid - 1;
}
}
return 0;
}
}

剑指offer72:求平方根_二分查找法