NC32 题解 | #求平方根#

求平方根

http://www.nowcoder.com/practice/09fbfb16140b40499951f55113f2166c

题意分析

  • 这个题目题目意思很简洁,就是让我们求出一个数的开根号之后的数据,向下进行取整。

思路分析

解法一 二分

  • 我们发现,最后的答案具有单调性,当我们求出某一个数字为mid的时候,我们可以和给出的数字进行比较,判断这个数字是大了还是小了,从而移动我们的边界。这样通过左右边界的移动我们最后就可以不断逼近最后的终点了。

图片说明

  • 代码如下,
    • 二分的时间复杂度为O(logn)
    • 只开了几个变量,空间复杂度为O(1)
class Solution {
public:
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    int sqrt(int x) {
        // write code here
        // 特判
        if(x<=0){
            return 0;
        }
        // 利用二分进行求解
        int l=1,r=x,mid;
        while(1){
            mid=(l+r)>>1;
            // 这个地方需要好好理解一下,因为题目上面说是进行向下取整
            if(mid<=x/mid&&(mid+1)>x/(mid+1)){
                return (int)mid;
                // 找到的点过小
            }else if(mid<x/mid){
                l=mid+1;
            // 找到的点过大
            }else{
                r=mid-1;
            }
        }
    }
};

解法二 数学定理

  • 我们首先需要了解一个牛顿迭代公式。(部分图片来自百度)

图片说明

知道了这个之后,我们就可以根据这个公式进行求解了。

  • 代码如下
    • 二分的时间复杂度为O(logn)
    • 只开了几个变量,空间复杂度为O(1)。
class Solution {
public:
    /**
     * 
     * @param x int整型 
     * @return int整型
     */
    int sqrt(int x) {
        // write code here
        // 特判0的情况
        if(x<=0){
            return 0;
        }
        int r=x;
        // 利用牛顿迭代式进行求解
        while(r>x/r){
            r=(r+x/r)/2;
        }
        return int(r);
    }
};
全部评论
一个神奇的事,r用int定义不会出错;但我用double定义r,x=7的时候会报错,但6,8,或其他输入暂时不会报错,这是什么情况?报错为:运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
点赞 回复 分享
发布于 2021-11-06 00:54
mid=(l+r)>>1;是什么意思啊
点赞 回复 分享
发布于 2021-08-22 16:01
谢谢大佬
点赞 回复 分享
发布于 2021-08-22 15:54

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务