【LeetCode】69. x 的平方根

题目:
【LeetCode】69. x 的平方根_第1张图片思路:
二分查找法,因为任何一个数的平方根都小于等于自己的一半+1。
所以我们使用二分查找法,一直把区间缩小至两位数之后,中位数使用有右中位数。左中位数会陷入死循环。
倒数第二次循环时,left 的平方小于或者等于 x ,right的平方比 x 大,最后采用有中位数,使得最后right = left;
返回left即可。

 public int mySqrt(int x) {
        //二分查找
       long left = 0;
       long right = x/2+1;
       while(left < right){
           //(a+b)/2 确实是中位数,但是如果a+b的和大于int 的最大值,就会出现越界
           //那么 实际上的运算可以变成 a + (a -b)/2;//假设a 比 b 大
           //但是最安全运算最快的还是 带符号右移一位
           // 为什么选择右中位数?
           //现在求9的平方【3,4】
           //3的平方 > 9 ?不大于,继续二分
           //但是下一个区间还是 【3,4】,会陷入死循环,但是如果是右中位数,就会直接跳出循环
          long mid = (right + left+1) >>>1;
          long square = mid*mid;
          if (square > x)
                right = mid - 1;
            else{
                left = mid;
         }
       }
       return (int)left;
       //因为无论如何最后区间会变成两个数,左中位是上一次的mid,如果右中位数大于了,那么left就是最后的值,此时进入下一个循环时right = left;
    
}

时间复杂度O(log 2 n);

牛顿法:
这题的解法用暴力解法是非常简单的。主要的麻烦在于如何解的更好,答案就是用牛顿迭代法。

下面这种方法可以很有效地求出根号 aa 的近似值:首先随便猜一个近似值 xx,然后不断令 xx 等于 xx 和 a/xa/x 的平均数,迭代个六七次后 xx 的值就已经相当精确了。

例如,我想求根号 22 等于多少。假如我猜测的结果为 44,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号 22 了:

作者:LOAFER
牛顿法
来源:力扣(LeetCode)

你可能感兴趣的:(LeetCode)