[leet code] Pow(x, n)

来源:互联网 发布:北航网络教育官网 编辑:程序博客网 时间:2024/06/04 18:02

Question: Implement pow(xn).

第二次做这道题仍然对以2为基数的解题方式感觉陌生.  直观做法, 超时. 于是只能考虑数值运算两大进阶解法:

1. 两分法 O(logn)

2. 2为基数: 将目标数字拆解成以2为基数的构成方式, 例如 123 = 2^6+2^5+2^4+2^3+2^1+2^0 O(logn)

对于第二种解法:

Step1: n为负数情况需要先求倒数, 检查越界

Step2: 对于x为负数情况先判断结果符号, 在求绝对值方便后续计算

Step3: x == Double.MIN_VALUE特殊情况处理, 数值运算都要注意对这一特殊情况进行处理 -Double.MIN_VALUE会越界.

Step4: 到这里才真正来到2为基数的解法. 基本思路是n每向右移动一位, 相当于x做了一次与自己相乘(x *= x) e.g. (x =3, n=8) =>(x=9, n=7) =>(x=81, n=3) =>(x=6561, n=1).

由于n相当于是每次/2于是O仍然是O(logn)

    public double myPow(double x, int n) {        if(x == 0) return 0;        if(n == 0) return 1;                if(n<0){ // case of result <1            if(x>=1/Double.MAX_VALUE || x <= -1/Double.MAX_VALUE){                x = 1/x;            }            else{                return Double.MAX_VALUE;            }        }        n = Math.abs(n);                boolean neg = false;        if(x<0 && n%2 !=0){            neg = true;        }                double res = 1;        if(x == Double.MIN_VALUE){            n -=1;            res *= x;         }        x = Math.abs(x);                while(n >0){            if((n & 1) != 0){                // check if overflow                if(res>Double.MAX_VALUE/x){                    return Double.MAX_VALUE;                }                res *= x;            }            x *= x;            n = n>>1;        }                if(neg) return -res;        return res;    }



0 0
原创粉丝点击