LeetCode 69.x的算术平方根

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,存在溢出的可能性。

猜你喜欢

转载自blog.csdn.net/weixin_52929798/article/details/130604565