[69.Sqrt(x)]
「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
题目描述
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
示例
示例 1:
输入: x = 4
输出: 2
示例 2:
输入: x = 8
输出: 2
解释: 8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 2^31 - 1
思路
经过之前的二分查找的算法题,今天继续使用一道算法题来强化二分查找。按照我们之前总结的步骤来。首先,在这道题里面,我们还是在一个在有序的数组中,找到特定的一个值。而这个值求平方小于等于x的最大整数,结合题目要求,数组是从0到target的连续整数。并且是结果必定存在。明确使用二分查找之后,下来就是明确区间的定义了,这里区间的定义不妨定义为 [1,target]。 接下来便是判断函数,即 x*x <target。下来就可以用代码来实现了。
代码实现
我们使用左闭右闭的写法来解决这道题:
class Solution {
public int mySqrt(int x) {
int left=1, right=x;
while(left<=right){
int mid = (left+right)/2;
//防止溢出,改用除法判断
int mi = x/mid;
if(mi == mid) return mid;
else if(mi < mid){
right = mid-1;
}
else{
left = mid+1;
}
}
return right;
}
}
while 循环与之前总结的一致。而我们为了防止溢出,另外求了一个mi,这里的mi在最后一次循环中满足mi*mid<=x,(mi+1)*mid+>x,恰好满足我们求平方小于等于x的最大整数的要求。 明确这一点,下面的判断与是否+-1就不难理解了(有效区间)。
总结
上述内容对二分查找进行了复习,另外针对了整型除法中存在的截断问题。