[leetCode刷题笔记]2017.03.30

50. Pow(x, n)

这道题要用递归,但是递归不能用一个个减,因为这样要是碰到很大的n的情况会有stack overflow error。所以要利用平方,一次变成n / 2。

public class Solution {
    public double myPow(double x, int n) {
        if (n == 0) {
            return 1;
        }
        double powV = myPow(x, n / 2);
        if (n % 2 != 0) {
            if (n > 0) {
                return x * powV * powV;
            }
            else {
                return powV * powV / x;
            }
        }
        else {
            return powV * powV;
        }
    }
}

69. Sqrt(x)

这道题也是用二分法。注意边界条件,还有要防止输入一个很大的数,所以要用long形式。

public class Solution {
    public int mySqrt(int x) {
        if (x == 0 || x == 1) {
            return x;
        } 
        return (int)find(x, 0, x);
        
    }
    private long find(long x, long lo ,long hi) {
        if (lo == hi) {
            return hi - 1;
        }
        long mid = lo + (hi - lo) / 2;
        if (mid * mid > x) {
            return find(x, lo, mid);
        }
        else if (mid * mid < x){
            return find(x, mid + 1, hi);
        }
        else {
            return mid;
        }
    }
}

275. H-Index II

二分法轻松·搞定

public class Solution {
    public int hIndex(int[] citations) {
        int len = citations.length;
        int lo = 0;
        int hi = len - 1;
        while (lo <= hi) {
            int mid = (hi + lo) / 2;
            if (citations[mid] == len - mid) {
                return len - mid;
            }
            else if (citations[mid] < len - mid) {
                lo = mid + 1;
            }
            else {
                hi = mid - 1;
            }
            
        }
        return len - lo;
    }
    
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值