LeetCode 69. x的平方根 java实现 个人算法之旅

实现 int sqrt(int x) 函数。

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

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

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

解题思路

1)使用二分查找,通过不断的缩小范围来查找符合的答案

二分法使用条件:1有序,2存在上下界,能过通过索引访问。

mid = left + (right - left)/2;//防止溢出,等于mid = (left + right)/ 2.

      if(x == 0 || x == 1)
        return x;
      int left = 1;
      int right = x;
      int result = 0;
      while(left <= right){
        int mid = left + (right - left)/2;
        if(mid == x / mid)
          return mid;
        else if(mid > x / mid){
          right = mid - 1;
        }else{
          left = mid + 1;
          result = mid;//最后都是加left加1,然后变成left > right
        }
        
      }
      return result;

2)牛顿迭代法

/*
故要求解sqrt(x),即求解sqrt(t)(t=x),
 即求函数f(x)=x2−t=0f(x)=x2−t=0的解,
我们给初始解赋一个初始值x0x0, 那么我们在点(x0,f(x0))(x0,f(x0))处对曲线作切线, 得到如下方程y−f(x0)=f(x0)′(x−x0)y−f(x0)=f(x0)′(x−x0),令y=0, 解得x=x0/2+t/(2x0)x=x0/2+t/(2x0), 
则迭代的解x1=x0/2+t/(2x0)x1=x0/2+t/(2x0),
像这样依次迭代xn=xn−1/2+t/(2xn−1)xn=xn−1/2+t/(2xn−1),
 若f(xn)f(xn)很接近于0(与0的差绝对值小于某个阈值),这迭代终止,xnxn即为函数的解

*/

class Solution {
    public int mySqrt(int x) {
      if(x == 0 || x== 1){
        return x;
      }
      double x0 = (double)x;
      double t = x;
      while(Math.abs(x0*x0-t) > 0.1){
        x0 = x0/2.0+t/(2.0*x0);
      }
      return (int)x0;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38765867/article/details/88376279