Implement pow(x, n), which calculates x raised to the power n (xn).

Example 1:

Input: 2.00000, 10
Output: 1024.00000

Example 2:

Input: 2.10000, 3
Output: 9.26100

Example 3:

Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Note:

  • -100.0 < x < 100.0
  • n is a 32-bit signed integer, within the range [−231, 231 − 1]

solution

time complexity : O(logn)
space complexity : O(logn)

class Solution {
public:
    double myPow(double x, int n) {
        return n > 0 ? helper(x, n) : 1 / helper(x, n);
    }
private:
    double helper(double x, int n) {
        if (n == 0) return 1;
        return helper(x*x, n/2) * (n % 2 ? x : 1);
    }
};

若用暴力法解O(n),會發生Time Limit Exceeded。
上網找了個解法,利用recursion來減少執行時間。

原理:

pow(x, n) := pow(x * x, n / 2) * (x if n % 2 else 1)
pow(x, 0) := 1 

舉個例子:

pow(x, 5) = pow(x^2, 2) * x 
          = pow(x^4, 1) * x 
          = pow(x^8, 0) * x^4 * x
          = 1 * x^4 * x = x^5