3. LeetCode 69. x的平方根

Posted konosekai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. LeetCode 69. x的平方根相关的知识,希望对你有一定的参考价值。

 

 代码:

class Solution 
public:
    int mySqrt(int x) 
        long long a = (long long)x;
        long long left = 0;
        long long right = a;
        while (left <= right) 
            long long mid = left + ((right - left) >> 1);
            if (mid * mid <= a) 
                if (((mid + 1) * (mid + 1)) > a) 
                    return (int)mid;
                
                else 
                    left = mid + 1;
                
            
            else 
                right = mid - 1;
            
        
        return 0;

    
;

思路:

1. 计算x的算术平方根的整数部分,假设这个值是a。那么a就是从0到x的数组中的最后一个元素值的平方小于等于x的元素的值。

2. 考虑到x最大值为2^31-1,如果用二分查找,mid * mid 就溢出了。所以先强转成long long型。

力扣69. x 的平方根

求开方

69. x 的平方根

题目描述:

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2

说明:

8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。

Math工具类计算

我们知道 java 的工具类中有计算平方根的方法,我们直接用就可以了。

代码:

 public int mySqrt(int x) {
         double sqrt = Math.sqrt(x);
        return (int)sqrt;
    }

执行用时:1 ms,

内存消耗:35.3 MB

二分查找

我们可以用二分查找来定位平方根的位置,一个数的平方根不会超过它的一半,所以 (x/2)2 <= x,得 x<=4。当 x = 3,时,返回 1 =3/2,当 x = 4时,返回,2 = 4/2。所以只需对x =0 和 x=1 做单独判断。

注意:

  1. 使用mid > x/mid 作为判断条件 而不用 mid * mid > x 是因为如果 mid 很大,那么有可能会超出整形范围。
  2. 在区间只有2个数的时候,有 mid =left ,一旦进入[mid …right],则区间不会继续在缩小,导致死循环。整数除法的下取整行为,导致了区间划分是 [left…mid - 1] 与 [mid…right] 的时候,如果搜索进入区间 [mid…right] 的时候,left = mid 导致区间不再缩小,进入死循环。

一开始我看此题时也是陷入了死循环中,看力扣中liweiwei1419的解题思路也算是成功解出

代码:

  static int mySqrt(int x) {
        /*
         *1. 定义左右区间,左边设置为0,右边为a
         * 2. 判断 mid 和 左右区间的关系
         */

        if (x == 0 || x == 1) {
            return x;
        }
        int l = 1, r = x;
        while (l < r) {
            //上取整防止进入死循环
            int mid = l + (r-l+1) / 2 ;

            if ( x / mid== mid) {
                return mid;
            } else if (x / mid > mid) {
                l = mid ;
            } else {
                r = mid - 1;
            }
        }

        return l;
    }

牛顿迭代法

参考链接:https://leetcode-cn.com/problems/sqrtx/solution/niu-dun-die-dai-fa-by-loafer/

以上是关于3. LeetCode 69. x的平方根的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题69-简单-x的平方根

LeetCode刷题69-简单-x的平方根

LeetCode 69. x 的平方根 | Python

LeetCode 69. x 的平方根 | Python

LeetCode 69. x 的平方根

LeetCode 69. x 的平方根