leetcode链接:https://leetcode-cn.com/problems/powx-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/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
题解思路:
- 按照定义,计算 x 的 n 次方是将 n 个 x 连乘,效率比较低,时间复杂度为$O(n)$ 会超时。
- 因为乘法具有结合律,考虑每次将一部分连乘批量计算好,作为最终答案的一部分。
- 这就可以将 n 进行二进制拆分,若 n 的二进制位的第 k 位是 11,则 ans 可以乘上 $x^2k$。
- 而计算 x^2k,只需每次将自身做平方即可。
代码如下:
class Solution {
public:
double myPow(double x, int n) {
double ans, p;
long long t = abs((long long)n);
p = x; ans = 1;
for ( ; t>0; t>>=1)
{
if(t&1==1) ans*=p;
p = p * p;
}
return n > 0 ? ans: 1/ans;
}
};
本文主要是学习快速幂,可联合矩阵快速幂计算斐波那契数列一同复习。
最后想说:
我的源码都整理在了github上,剑指offer专题会分类整理(如树专题,DP专题,模拟专题,搜索专题等),github链接见下文,如果对您有帮助,请帮忙在github中star,这对我很重要!!!! 拜托拜托~!!