[leetCode刷题笔记]2017.03.30

本文介绍了三种高效的算法设计方法:快速幂算法实现Pow(x,n),二分查找法求解Sqrt(x)及H-Index II问题。通过巧妙运用递归与二分法,这些算法能够显著提高运算效率并有效避免栈溢出等问题。

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;
    }
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值