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.

翻译

实现 int sqrt(int x).

计算并返回x的平方个, x保证为一个非负整数

由于返回类型是整数, 小数部分被截取,只有整数部分返回

例 1:

输入: 4
输出: 2

例 2:

输入: 8
输出: 2

解释:
8的平方根是2.82842…, 截掉小数部分,返回2.

两种方法

二分法

//二分法  超时了不知道对错
int mySqrt(int x){
long long i = 0;
long long j = (x + 1)/2;
while (i <= j)
{
    long long mid = (i + j) / 2;
    long long sq = mid * mid;
    if (sq == x) return mid;
    else if (sq < x) i = mid + 1;
    else j = mid - 1;
}
return j;
}

牛顿法

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)} xn+1=xnf(xn)f(xn)

最终代码

int mySqrt(int x) {//二分法
    if (x <= 0) return 0;
    int a = 1;
    // -1避免溢出
    int b = (x == INT_MAX) ? (x - 1) : x; 
 
    while (a < b) {
        if (b - a == 1) return a;
        //二分取中点
        int m = (a + b) / 2;
        //判断当前中点与平方根的关系
        int d = m - (x / m);
        //如果d为零说明 m是平方根,而且平方根是一个整数
        if (d == 0) return m;
        //如果d小于0说明 m小于平方根
        if (d  < 0) a = m;
        //如果d大于0说明 m小于平方根
        else        b = m;
    }
    return a;
}

总结:

  1. leetcode里面是32位的变量,所以int最大值为2147483647,而不是16位的32767

参考:

  1. 牛顿法
  2. 参考的二分法代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值