题目描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码以及思路
class Solution {
public int mySqrt(int x) {
/**
* 第一种做法:暴力法
* for i 从0到x,计算每一个i的平方,如果(第一个)i*i大于等于x,那么这个i就是本题的解了
* 但是这样会导致时间太长,提交程序发生错误
*
* 第二种做法:折半查找
* 定义left、right、mid
* left=0、right=x
* 因为结果是向下取整,例如2.333算成2、2.888也算成2
* 所以有两种情况
* 第一种,x/mid==mid,这种取边缘值
* 第二种,left与right指向两个相邻的数,取较小值left为结果
*
* 循环如下:
* mid=(left+right)/2
* 如果 right-left<=1 ,停止循环
* 如果 x/mid 大于 mid ,那么 left=mid
* 如果 x/mid 小于 mid, 那么 right=mid
* 如果x/mid 等于mid,那么返回 mid
*
* 循环以后,返回left
* @param x
* @return
*/
int left=0;
int right=x;
int mid=0;
if(x==1){
return 1;
}
while(right-left > 1){
mid=(int)(left+right)/2;
if(x/mid < mid){
right=mid;
}else if(x/mid > mid) {
left=mid;
}else{
return mid;
}
}
return left;
}
}
总结
二分查找法的应用应该在熟悉一下。