|  | 
|  | 1 | +package com.leetcode.arrays.binarysearch; | 
|  | 2 | + | 
|  | 3 | +import static org.junit.jupiter.api.Assertions.assertEquals; | 
|  | 4 | + | 
|  | 5 | +/** | 
|  | 6 | + * Level: Medium | 
|  | 7 | + * Link: https://leetcode.com/problems/powx-n/ | 
|  | 8 | + * Description: | 
|  | 9 | + * Implement pow(x, n), which calculates x raised to the power n (x^n). | 
|  | 10 | + * <p> | 
|  | 11 | + * Example 1: | 
|  | 12 | + * Input: 2.00000, 10 | 
|  | 13 | + * Output: 1024.00000 | 
|  | 14 | + * <p> | 
|  | 15 | + * Example 2: | 
|  | 16 | + * Input: 2.10000, 3 | 
|  | 17 | + * Output: 9.26100 | 
|  | 18 | + * <p> | 
|  | 19 | + * Example 3: | 
|  | 20 | + * Input: 2.00000, -2 | 
|  | 21 | + * Output: 0.25000 | 
|  | 22 | + * Explanation: 2^-2 = 1/22 = 1/4 = 0.25 | 
|  | 23 | + * <p> | 
|  | 24 | + * Note: | 
|  | 25 | + * -100.0 < x < 100.0 | 
|  | 26 | + * n is a 32-bit signed integer, within the range [−231, 231 − 1] | 
|  | 27 | + * | 
|  | 28 | + * @author rampatra | 
|  | 29 | + * @since 2019-08-19 | 
|  | 30 | + */ | 
|  | 31 | +public class PowXN { | 
|  | 32 | + | 
|  | 33 | +    /** | 
|  | 34 | +     * In this approach we iterate n times and keep multiplying x with x. | 
|  | 35 | +     * Runtime: <a href="https://leetcode.com/submissions/detail/253075786/">Time limit exceeded</a>. | 
|  | 36 | +     * | 
|  | 37 | +     * @param x | 
|  | 38 | +     * @param n | 
|  | 39 | +     * @return | 
|  | 40 | +     */ | 
|  | 41 | +    public static double myPowNaive(double x, int n) { | 
|  | 42 | +        if (n == 0) { | 
|  | 43 | +            return 1; | 
|  | 44 | +        } | 
|  | 45 | +        double res = x; | 
|  | 46 | +        int absN = Math.abs(n); | 
|  | 47 | +        for (int i = 1; i < absN; i++) { | 
|  | 48 | +            res *= x; | 
|  | 49 | +        } | 
|  | 50 | +        return n < 0 ? 1 / res : res; | 
|  | 51 | +    } | 
|  | 52 | + | 
|  | 53 | + | 
|  | 54 | +    /** | 
|  | 55 | +     * In this approach, we iterate log n times. We omit half of n each time. When n is odd, we store whatever product | 
|  | 56 | +     * we have calculated so far in the final result. | 
|  | 57 | +     * <p> | 
|  | 58 | +     * Runtime: <a href="https://leetcode.com/submissions/detail/253276630/">1 ms</a>. | 
|  | 59 | +     * | 
|  | 60 | +     * @param x | 
|  | 61 | +     * @param n | 
|  | 62 | +     * @return | 
|  | 63 | +     */ | 
|  | 64 | +    public static double myPow(double x, int n) { | 
|  | 65 | +        double res = 1; | 
|  | 66 | +        long absN = Math.abs((long) n); | 
|  | 67 | + | 
|  | 68 | +        while (absN > 0) { | 
|  | 69 | +            if (absN % 2 == 1) res *= x; // store whatever we have calculated so far in the final result | 
|  | 70 | +            x *= x; | 
|  | 71 | +            absN /= 2; | 
|  | 72 | +        } | 
|  | 73 | +        return n < 0 ? 1 / res : res; | 
|  | 74 | +    } | 
|  | 75 | + | 
|  | 76 | +    public static void main(String[] args) { | 
|  | 77 | +        assertEquals(1024.0, myPowNaive(2.0, 10)); | 
|  | 78 | +        assertEquals(0.25, myPowNaive(2.0, -2)); | 
|  | 79 | +        assertEquals(0.0, myPowNaive(0.00001, 2147483647)); | 
|  | 80 | + | 
|  | 81 | +        assertEquals(1024.0, myPow(2.0, 10)); | 
|  | 82 | +        assertEquals(0.25, myPow(2.0, -2)); | 
|  | 83 | +        assertEquals(0.0, myPow(0.00001, 2147483647)); | 
|  | 84 | +    } | 
|  | 85 | +} | 
0 commit comments