【Leetcode】50. Pow(x, n)

题目描述:

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000

示例 2:

输入: 2.10000, 3
输出: 9.26100

示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2^(-2) = 1/2^2 = 1/4 = 0.25

说明:

  • -100.0 < x < 100.0
  • n 是 32 位有符号整数,其数值范围是 [-2^{31}2^{31} − 1] 。

思路:

这题最简单快速的方法当然是调用库函数了,不过显然不是题目所考察的点。

这题如果是没做过的话,感觉能做好也不容易,不过做过一遍之后基本上不会忘记了。这题正确的打开方式应该用快速幂,更准确地说应该是二分快速幂。

首先我们看一下我们平常算次方怎么算的,比如3的5次方,3 * 3 * 3 * 3 * 3 = 273, 做4次乘法就好了,好像也不是很复杂,但是如果算1.01的1亿次方呢?我们就要做1一次乘法,这种O(N)的复杂度显然还是不够友好。那么能不能简化操作呢?

还是看3^{5}3^{5}=3*3*3*3*3其实可以写成(3*3)^{2}*3,这样只做了3次乘法;如果是3^{8}3^{8}=3*3*3*3*3*3*3*3做了7次乘法, 如果换成 ((3*3)^{2})^{2} ,这只做了3次乘法。结论来了,对于x^{n}

                                 x^{n}=\left\{\begin{matrix} x^{\frac{n}{2}} * x^{\frac{n}{2}} , \qquad n\ is\ even\ num; \\ x^{\frac{n-1}{2}} * x^{\frac{n-1}{2}} * x,\qquad n\ is\ odd\ num. \end{matrix}\right.

这就是快速幂的"快速"之处,对于每一次的x^{k},都可以通过计算x^{k/2}(k为偶数)或者x^{(k-1)/2}(k为奇数)得到,这样的话直接将O(N)的复杂度降为O(logN)。

代码:

class Solution {
    public double myPow(double x, int n) {
        double ans = 1, temp = x;
        int flag = n;
        while (flag != 0) {
            if ((flag & 1) == 1) {  // 判断flag二进制最后一位是否为1,比 if ((flag % 2) != 0)稍微快点 
                ans = ans * temp;
            }
            temp = temp * temp;
            flag /= 2;
        }
        return n > 0 ? ans : 1 / ans;
    }
    
}

 

你可能感兴趣的:(算法,java,leetcode)