【LeetCode69】x的平方根(二分or牛顿迭代法)

举报
野猪佩奇996 发表于 2022/01/23 01:56:47 2022/01/23
【摘要】 1.题目 2.法一:二分查找 上界为0,下界为x(可以直接写为x/2+1),二分查找。 (1)mid=(left+right)/2,为了防止2个数之和过大,造成溢出,也可以写成left+(righ...

1.题目

在这里插入图片描述

2.法一:二分查找

上界为0,下界为x(可以直接写为x/2+1),二分查找。
(1)mid=(left+right)/2,为了防止2个数之和过大,造成溢出,也可以写成left+(right-left)/2,或者除二用移位运算——int mid=left+((right-left)>>1),注意后面这块需要加个括号(因为位运算的优先级更低)。

(2)mid*mid显然不能用int了(否则可能溢出),要用long long强制类型转换。

(3)如果找到精确结果则返回,最后返回的right实现返回的是舍去小数部分的整数。

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3.法二:牛顿迭代法

在数值分析这门课有牛顿迭代法求开根号,通过递推式 X m = X n − f ( X n ) / f ′ ( X n ) Xm=Xn-f(Xn)/f'(Xn) Xm=Xnf(Xn)/f(Xn),其中 m = n + 1 m=n+1 m=n+1,不断迭代得到近似值。
在这里插入图片描述
(1)迭代结束标志
当相邻两次迭代得到的交点非常接近,一般绝对值为10 ^ -6或 10 ^ -7都可以。

(2)选用x0=C作初始点
从右边开始迭代才能优先得到根号C,如果从0开始迭代则会优先得到负根号C。
在这里插入图片描述

class Solution {
public:
    int mySqrt(int x) {
        if(x<=1){
            return x;
        }
        double C=x,x0=x;
        while(true){
            double xi=(x0+C/x0)*0.5;
            if(fabs(x0-xi)<1e-7){
                break;
            }
            x0=xi;
        }
        return int(x0);
    }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4.reference

https://zh.wikipedia.org/wiki/%E7%89%9B%E9%A1%BF%E6%B3%95#/media/File:NewtonIteration_Ani.gif

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/113943383

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。