zoukankan      html  css  js  c++  java
  • 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数。

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

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

    示例 1:

    输入: 4
    输出: 2
    

    示例 2:

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

     1 #include "_000库函数.h"
     2 
     3 //最简单想法,耗时长
     4 class Solution {
     5 public:
     6     int mySqrt(int x) {
     7         if (x <= 1)return x;
     8         double n = 0;//防止int溢出
     9         while (++n) {
    10             if (n*n > x) {
    11                 --n;
    12                 return (int)n;
    13             }
    14             else if (n*n == x)
    15                 return (int)n;
    16         }
    17         return 0;//力扣非得要在这里加一个return,无语了
    18     }
    19 };
    20 
    21 //用对折法
    22 //因为x为int,最大为65536的平方
    23 //贼鸡儿快,内存很少
    24 class Solution {
    25 public:
    26     int mySqrt(int x) {
    27         if (x <= 1)return x;
    28         double min = 1, max = 65536, mid = (int)((min + max)/2);//防止int溢出
    29         while (min < max&&mid*mid != x) {
    30             if (mid*mid < x)min = mid + 1;
    31             else max = mid - 1;
    32             mid = (int)((min + max)/2);
    33         }
    34         if (mid*mid > x)--mid;
    35         return (int)mid;
    36     }
    37 };
    38 
    39 
    40 //同样折半,更简洁
    41 class Solution {
    42 public:
    43     int mySqrt(int x) {
    44         if (x <= 1) return x;
    45         int left = 0, right = x;
    46         while (left < right) {
    47             int mid = left + (right - left) / 2;
    48             if (x / mid >= mid) left = mid + 1;
    49             else right = mid;
    50         }
    51         return right - 1;
    52     }
    53 };
    54 
    55 //更牛逼的方法
    56 //用牛顿迭代法,记得高数中好像讲到过这个方法,是用逼近法求方程根的神器,
    57 //因为要求x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,可以求出递推式如下:
    58 //
    59 //xi + 1 = xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n / xi) / 2
    60 
    61 class Solution {
    62 public:
    63     int mySqrt(int x) {
    64         long res = x;
    65         while (res * res > x) {
    66             res = (res + x / res) / 2;
    67         }
    68         return res;
    69     }
    70 };
    71 void T069() {
    72     Solution s;
    73     cout << "2:    " << s.mySqrt(2) << endl;
    74     cout << "8:    " << s.mySqrt(8) << endl;
    75     cout << "0:    " << s.mySqrt(0) << endl;
    76     cout << "9:    " << s.mySqrt(9)<<endl;
    77 }
  • 相关阅读:
    几个数之和----数组刷题
    单调栈刷题
    腾讯金融科技凉经
    mysql刷题
    链表类题目常用方法
    阿里云一面凉经
    腾讯TEG一面凉经
    腾讯软件开发-后台开发实习生-一面凉经
    剑指 Offer 19. 正则表达式匹配
    剑指 Offer 20. 表示数值的字符串
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10696512.html
Copyright © 2011-2022 走看看