Sunday, January 8, 2017

Pow(x, n)

Implement pow(xn).

/*
The naive way is to use a for loop to multiply x every time. 
time:O(n), space:O(1)

The better way is to use divide & conquer, cut n to half from every recursion.
Be careful when n = Integer.MIN_VALUE, if directly set n = -n, it will be wrong due to out of Integer range. So we can do some transformation, let it be x / x^(-(n + 1)), when n < 0.

time:O(logn), space:O(1)
*/

public class Solution {
    public double myPow(double x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n < 0) {
            double ans = x * myPow(x, -(n + 1));
            return 1.0 / ans;
        }
        
        double t = myPow(x, n / 2);
        return n % 2 == 0 ? t*t : x*t*t;
    }

}

No comments:

Post a Comment