题目:
分析:
- 想要找到算术平方根, 可以从一个从零开始依次增大的数组中, 依次算他的平方并和target比较
- 因为这个数组是有序的, 所以数组具有**"二段性"** , 可以使用二分查找算法
- 因为结果只保留整数部分, 所以我们可以将数组分成两段, <= target 和 > target
- 如果平方<=target, 应该让left = mid
- 如果平方> target, 应该让right = mid - 1;
- 根据二分查找算法的模版二, 定义mid应该是int mid = left + (right - left + 1) /2
为什么分成<= 和 > 而不是 < 和>=?
因为我们要的结果可能是正好等于target位置, 和取整数部分时可能会小于target的位置, 所以<=在一组, >在一组
代码:
java
class Solution {
public int mySqrt(int x) {
long left = 0;
long right = x;
if(x<1) return 0;//细节处理
while(left<right){
long mid = left + (right - left + 1) /2;
if(mid * mid <= x) left = mid;
else right = mid-1;
}
return (int)left;
}
}