x的算术平方根
题目链接:LeetCode 69.x的算术平方根
给你一个非负整数 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
思路:
定义target在左闭右闭的区间里,[left,right]。
设立两个指针left和right。
middle=(left+right)/2。
如果判断x等于middle*middle或num在middle*middle的左边,则更新右指针为middle。
否则x就在middle*middle的右边,则更新左指针为middle。
循环到left-right<=1,循环终止。
最后得出的答案x的平方根取整后的结果就是left。
代码:
class Solution
{
public:
int mySqrt(int x)
{
// 二分查找区间为[0,2^31-1]
int left = 0, right = pow(2, 31) - 1;
while (right - left > 1)
{
double middle = left + ((right - left) >> 1);
if (middle * middle > x)
{
right = middle;
}
else
{
left = middle;
}
}
return left;
}
};
解释:
left + ((right - left) >> 1)==(left + right) / 2
因为left+right可能溢出,(right-left)使用减法不会超出最大的整型范畴,所以使用第一种方法可以防止溢出。
>>是右移运算符,右移一位等于除以2,右移n位等于除以2的n次方。
middle取值必须为double,如果为int,存在溢出的可能性。