Leetcode Pow(x,n) 和 sqrt(x)

pow(x,n)

[code]

public class Solution {
    public double pow(double x, int n) {
        if(x==0)return 0;
        if(n==0)return 1;
        boolean negative= n<0;
        n=Math.abs(n);
        double half=pow(x, n/2);
        double r= n%2==0 ? half*half : half*half*x;
        return negative ? 1/r : r;
    }
}

[Thoughts]
corner cases: x<0, n<0, x=0, n=0, overflow


sqrt(x)

[code]

public class Solution {
    public int sqrt(int x) {
        if(x<0)return -1;
        if(x==0)return 0;
        int i=1;
        while(i*i<x && i*i<=Integer.MAX_VALUE/4)i*=2;
        if(i*i==x)return i;
        if(i*i<x)
        {
            while(i*i<x && i*i>0 )i++;
            if(i*i==x)return i;
            return i-1;
        }
        else
        {
            int low=1, high=i;
            while(low<high-1)
            {
                int mid=(low+high)/2;
                int pow=mid*mid;
                if(pow==x)return mid;
                else if(pow<x)
                {
                    low=mid;
                }
                else high=mid-1;
            }
            if(low==high)return low;
            else if(low==high-1)
            {
                int p1=low*low, p2=high*high;
                if(p1==x)return low;
                if(p2==x)return high;
                if(p2>x)return low;
                return high;
            }
            return 0;
        }
    }
}

[Thoughts]
这题难点在于处理overflow.
i*i 会造成溢出, 所以干脆用除法。。。有个更简洁的code.

之所以简洁是因为 if(p>q)return q

1. 一个元素, mid<x, return q
2. 一个元素, mid>x, return q
3. 二个元素 ,  mid>x, return q

[code]

public int sqrt(int x) {
    return sqrt(x, 1, x);
}
private int sqrt(int x, int p, int q) {
    if (p > q)
        return q;
    int mid = (p + q) / 2;
    if (x / mid == mid)
        return mid;
    else if (x / mid < mid )
        return sqrt(x, p, mid - 1);
    else
        return sqrt(x, mid + 1, q);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值