C++实现LeetCode( 69.求平方根)

 更新时间:2021年07月17日 09:38:30   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode( 69.求平方根),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 69. Sqrt(x) 求平方根

Implement int sqrt(int x).

Compute and return the square root of x, where x is guaranteed to be a non-negative integer.

Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.

Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.

这道题要求我们求平方根,我们能想到的方法就是算一个候选值的平方,然后和x比较大小,为了缩短查找时间,我们采用二分搜索法来找平方根,找最后一个不大于目标值的数,这里细心的童鞋可能会有疑问,在总结贴中第三类博主的 right 用的是开区间,那么这里为啥 right 初始化为x,而不是 x+1 呢?因为总结帖里的 left 和 right 都是数组下标,这里的 left 和 right 直接就是数字本身了,一个数字的平方根是不可能比起本身还大的,所以不用加1,还有就是这里若x是整型最大值,再加1就会溢出。最后就是返回值是 right-1,因为题目中说了要把小数部分减去,只有减1才能得到正确的值,代码如下:

解法一:

class Solution {
public:
    int mySqrt(int x) {
        if (x <= 1) return x;
        int left = 0, right = x;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (x / mid >= mid) left = mid + 1;
            else right = mid;
        }
        return right - 1;
    }
};

这道题还有另一种解法,是利用牛顿迭代法,记得高数中好像讲到过这个方法,是用逼近法求方程根的神器,在这里也可以借用一下,因为要求 x2 = n 的解,令 f(x)=x2-n,相当于求解 f(x)=0 的解,可以求出递推式如下:

xi+1=xi - (xi- n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2

解法二:

class Solution {
public:
    int mySqrt(int x) {
        if (x == 0) return 0;
        double res = 1, pre = 0;
        while (abs(res - pre) > 1e-6) {
            pre = res;
            res = (res + x / res) / 2;
        }
        return int(res);
    }
};

也是牛顿迭代法,写法更加简洁一些,注意为了防止越界,声明为长整型,参见代码如下:

解法三:

class Solution {
public:
    int mySqrt(int x) {
        long res = x;
        while (res * res > x) {
            res = (res + x / res) / 2;
        }
        return res;
    }
};

到此这篇关于C++实现LeetCode( 69.求平方根)的文章就介绍到这了,更多相关C++实现求平方根内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VSCode 配置C++开发环境的方法步骤

    VSCode 配置C++开发环境的方法步骤

    这篇文章主要介绍了VSCode 配置C++开发环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C语言中实现KMP算法的实例讲解

    C语言中实现KMP算法的实例讲解

    KMP算法即字符串匹配算法,C语言中KMP可以避免指针回溯从而达到高效,接下来就来总结一下C语言中实现KMP算法的实例讲解
    2016-06-06
  • 如何使用VC库函数中的快速排序函数

    如何使用VC库函数中的快速排序函数

    下面呢,小编就为大家介绍一下VC中库函数qsort()的用法。需要的朋友可以过来参考下
    2013-09-09
  • 一文读懂C++中的继承之菱形继承(案例分析)

    一文读懂C++中的继承之菱形继承(案例分析)

    这篇文章主要介绍了C++中的继承之菱形继承的相关知识,通过案例给大家详细分析介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-04-04
  • C++设计模式之备忘录模式

    C++设计模式之备忘录模式

    这篇文章主要介绍了C++设计模式之备忘录模式,本文讲解了什么是备忘录模式、备忘录模式的UML类图、备忘录模式的使用场合等内容,需要的朋友可以参考下
    2014-10-10
  • 详解dll动态库的开发与调用及文件的读写小程序

    详解dll动态库的开发与调用及文件的读写小程序

    这篇文章主要介绍了详解dll动态库的开发与调用及文件的读写小程序的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • C++面向对象之多态的实现和应用详解

    C++面向对象之多态的实现和应用详解

    相信大家都知道面向对象的三大特性是封装,继承和多态,下面这篇文章主要给大家介绍了关于C++面向对象之多态的实现和应用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • C++中发声函数Beep用法

    C++中发声函数Beep用法

    本文给大家分享的是Beep函数的用法以及会使扬声器发出简单的声音的示例,有需要的小伙伴可以参考下
    2017-05-05
  • C语言中6组指针和自增运算符结合方式的运算顺序问题

    C语言中6组指针和自增运算符结合方式的运算顺序问题

    本文通过代码实现分析了6种组合:* p++,(* p)++,* (p++),++* p,++( * p), * (++p),需要的朋友可以参考下
    2015-07-07
  • C++ 实现桶排序的示例代码

    C++ 实现桶排序的示例代码

    桶排序或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子,本文详细的介绍了如何实现,感兴趣的可以了解一下
    2021-07-07

最新评论