【算法通关】50. Pow(x, n)——快速幂

5,431 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

点赞再看,养成习惯。微信搜索【一条coding】关注这个梦想弃码从文程序员。

本文收录于技术专家修炼,里面有我的学习路线、系列文章、面试题库、自学资料、电子书等。欢迎star⭐️


面试的时候遇到这个题目,

然后我思考🤔了片刻,写出了 return pow(x,n);

面试官问我,为啥这么写?

我说,这是软件工程的代码复用;不重复造轮子;

于是,面试官就要把我挂了😂;

说了一句,我们决定复用公司原来的员工(❁´◡`❁)。

——leetcode此题热评

前言

大家好,我是一条,欢迎来到我的算法频道。

只做有趣的算法题,只为面试写算法

Question

50. Pow(x, n)

难度:中等

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

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104

Solution

这是一道经典快速幂的题。

快速幂法可将求幂的时间复杂度由O(n)降低至 O(logn)*。看这样一个例子:

求2的9次幂,首先将9转化为2进制:1001

2^9=2^8+2^1,我们发现转换为二进制之后,为0的位不需要计算幂,只需要把为1的位计算幂之后相乘。

转换为代码就变得很巧妙,这个模板要记住。

while(b > 0) {
  // 判断最低位是否为1
	if((b & 1) == 1){
    // 如果是1,相乘
    res *= x;
  }  
  //x是每次都要计算幂
	x *= x;
  //二进制位遍历
  b >>= 1;
}

另外本题还有一个点是当 n = -2147483648 时执行 n = -n会因越界而赋值出错,需要使用long

注意观察取值范围很重要。

Code

/**
 * @author 一条coding
 */
class Solution {
    public double myPow(double x, int n) {
        if(x == 0.0f) return 0.0d;
        long b = n;
        double res = 1.0;
        if(b < 0) {
            x = 1 / x;
            b = -b;
        }
        while(b > 0) {
            if((b & 1) == 1) res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }
}

最后

点赞,点赞,还TMD是点赞!