leetcode-69.x的平方根

Points

二分查找

牛顿迭代

题意

实现 int sqrt(int x) 函数。

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

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

示例 1:

输入: 4
输出: 2

示例 2:

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

示例 3:

输入: 2147395600
输出: 46340

算法-1---牛顿迭代

 用时:16ms

 复杂度:应该是小于二分的。代值验证了一下,但不完全。

 递推公式:

Xn+1  = X- (F(x) / F'(x)), 这相当于是求解  r2 = x, 即 F(r) = r2 - x

化简得:Xn+1  = 1/2 (Xn - x/X(n)) 

 不明白的话,请留言或者自行参考文首连接。

code

 1 class Solution {
 2 public:
 3     int mySqrt(int x) {
 4         long ans = x;;
 5         while(true)
 6         {
 7             if(ans*ans <= x && (ans+1)*(ans+1) > x)
 8                 break;
 9             else
10             {
11                 ans = long(0.5*(ans + x/ans));
12             }
13         }
14         return ans;
15     }
16 };

 

算法-2---二分查找

 用时:16ms

 复杂度:O(log2n)

二分查找,是固定套路,套就完了,但是要注意的是,搞清楚取 右值 的原因。

code

 1 class Solution {
 2 public:
 3     int mySqrt(int x) {
 4         long left = 0, right = x, mid;
 5         while(left <= right)
 6         {
 7             mid = (left + right)/2;
 8             if(mid * mid > x)
 9                 right = mid -1;
10             else if(mid * mid < x)
11                 left = mid + 1;
12             else
13                 return mid;
14         }
15         return right;
16     }
17 };