- 快速幂
题目描述
实现 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
解题思路
解题思路:
- 求 x n x^n xn 最简单的方法是通过循环将 n 个 x 乘起来,依次求 x 1 , x 2 , . . . , x n − 1 , x n x^1, x^2, ..., x^{n-1}, x^n x1,x2,...,xn−1,xn,时间复杂度为 O(n) 。
- 快速幂法 可将时间复杂度降低至 O ( l o g 2 n ) O(log_2 n) O(log2n),以下从 “二分法” 和 “二进制” 两个角度解析快速幂法。
快速幂解析(二进制角度)
利用十进制数字 n 的二进制表示,可对快速幂进行数学化解释。
-
对于任何十进制正整数 n ,设其二进制为 " b m . . . b 3 b 2 b 1 b_m...b_3b_2b_1 bm...b3b2b1( b i b_i bi为二进制某位值,i ∈ \in ∈ [1,m]),则有:
- 二进制转十进制: n = 2 m − 1 b m + . . . + 4 b 3 + 2 b 2 + 1 b 1 n = 2^{m-1}b_m + ... + 4b_3 +2b_2 + 1b_1 n=2m−1bm+...+4b3+2b2+1b1(即二进制转十进制公式) ;
- 幂的二进制展开: x n = x 2 m − 1 b m + . . . + 4 b 3 + 2 b 2 + 1 b 1 = x 2 m − 1 b m . . . x 4 b 3 x 2 b 2 x 1 b 1 x^n = x^{2^{m-1}b_m + ... + 4b_3 +2b_2 + 1b_1} = x^{2^{m-1}b_m}...x^{4b_3}x^{2b_2}x^{1b_1} xn=x2m−1bm+...+4b3+2b2+1b1=x2m−1bm...x4b3x2b2x1b1;
-
因此,应用以上操作,可在循环中依次计算 x 2 0 b 1 , x 2 1 b 2 , . . . , x 2 m − 1 b m x^{2^{0}b_1}, x^{2^{1}b_2}, ..., x^{2^{m-1}b_m} x20b1,x21b2,...,x2m−1bm累计相乘即可。
- 当 b i = 0 b_i = 0 bi=0 时, x 2 i − 1 b i = 1 x^{2^{i-1}b_i} = 1 x2i−1bi=1;
- 当 b i = 1 b_i = 1 bi=1时: x 2 i − 1 b i = x 2 i − 1 x^{2^{i-1}b_i} = x^{2^{i-1}} x2i−1bi=x2i−1
到这步有两个问题:怎么判断b==0或1?怎么求 x 2 i − 1 x^{2^{i-1}} x2i−1?
1.怎么判断b==0或1?
获取二进制各位
b
1
,
b
2
,
b
3
,
.
.
.
,
b
m
b_1, b_2, b_3, ..., b_m
b1,b2,b3,...,bm的值: 循环执行以下操作即可:
- n & 1(与操作): 判断 n 二进制最右一位是否为 1 ;
- n>>1(移位操作): n 右移一位(可理解为删除最后一位)。
2.怎么求
x
2
i
−
1
x^{2^{i-1}}
x2i−1?
计算
x
1
,
x
2
,
x
4
,
.
.
.
,
x
2
m
−
1
x^1, x^2, x^4, ..., x^{2^{m-1}}
x1,x2,x4,...,x2m−1的值: 循环赋值操作
x
=
x
2
x = x^2
x=x2即可,每进行一次移位操作,都执行一次
x
=
x
2
x = x^2
x=x2。
代码
class Solution:
def myPow(self, x: float, n: int) -> float:
if x == 0: return 0
if n < 0: x, n = 1/x, -n
res = 1
while n:
if n & 1 == 1: res *= x
x *= x
n >>= 1
return res
复杂度分析
- 时间复杂度 O ( l o g 2 n ) O(log_2 n) O(log2n): 二分的时间复杂度为对数级别。
- 空间复杂度 O(1) : res, b 等变量占用常数大小额外空间。
作者:jyd
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/solution/mian-shi-ti-16-shu-zhi-de-zheng-shu-ci-fang-kuai-s/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。