Leetcode-69: Sqrt(x)

本文介绍了使用二分查找(binary search)和牛顿迭代法(Newton's method)两种方法来求解整数平方根的问题。通过C++代码实现并演示了如何找到一个整数的平方根,特别注意了边界条件和溢出问题。

这题我就用binary search做的,用牛顿迭代法应该更快。

解法1: binary search

注意:

1) 当x=INT32_MAX时,long long j=x+1会等于0。因为x+1还是integer,溢出后等于0,所以要加(long long)。
2) mid^2<=x<=(mid+1)^2时,要注意是否应该返回x+1。
3) j的上界可能不需要到x+1,下次要仔细想想。

#include <iostream>

using namespace std;

int mySqrt(int x) {
    long long i=0, j=(long long)x+1;     //if j=x+1, then j=0!!!
    while(i<j) {
        long long mid=i+(j-i)/2;
        if (mid*mid > x) {
            j=mid;
        }else if ((mid+1)*(mid+1)<x) {
            i=mid+1;
        }else {  //mid^2<=x<=(mid+1)^2
            if ((mid+1)*(mid+1)==x) return mid+1;
            return mid;
        }
    }
}

int main()
{
    cout<<mySqrt(4)<<endl;
    cout<<mySqrt(9)<<endl;
    cout<<mySqrt(10)<<endl;
    cout<<mySqrt(2147395599)<<endl;
    cout<<mySqrt(2147483647)<<endl;   //maximum of INT_32!

    return 0;
}

解法2: 牛顿迭代法 (下次补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值