题目如图:
先展示代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param x int整型
* @return int整型
*/
public int sqrt (int x) {
if(x<2){
return x;
}
int left = 1;
int right = x / 2;
while (left < right) {
int mid = left + (right - left+1) / 2;
int temp = x / mid;
if (mid <= temp) {
left = mid;
} else{
right=mid-1;
}
}
return left;
}
}
该代码使用的方法是二分法
思路:
1.因为当x取0或1时,0或1的平方根都是自身,所以先将这两个特殊情况筛选出来
2.由于是向下取整,所以除了0和1以外,x的平方根最大肯定都不会超过自身的一半,因此x平方根的取值范围是1-x/2
3.求出在left和right中的中点mid,但计算mid时要用(left+right+1)/2,因为(left+right)/2在很多情况下会造成死循环(不相信可以代入4或9尝试一下),而mid = left + (right - left+1) / 2则是为了防止溢出的写法
4.通过temp=x/mid所得到的值与mid进行比较可以判断mid此时对于x的平方根来说是小还是大,如果mid的值大于temp就说明mid较大,反之则较小,但由于是向下取整,所以当mid较小时也有可能是要取得的平方根所以取范围的右边时设left=mid,但若mid较大,该mid就不可能是满足条件的,所以取范围的左边时取right=mid-1
5.当left与right相遇时便得到了x的平方根,返回left的值即可