leetcode 50 Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例:
输入: 2.00000, 10
输出: 1024.00000
输入: 2.00000, -2
输出: 0.25000
解释: 2 − 2 = 1 / 2 2 2^{-2} =1/2^{2} 2−2=1/22 = 1/4 = 0.25
解题思路:
暴力法:写个循环,循环n次乘以一个x,O(N)
分治法:把x的乘积一分为二,还要考虑n是奇数还是偶数,若是偶数,两边就是n/2,那么只需要计算
y
=
x
n
/
2
y = x^{n/2}
y=xn/2,另一边也是同样的值。若是奇数,把中间的x拿去,计算两边,也是计算
y
=
x
n
/
2
y = x^{n/2}
y=xn/2,整除n,
r
e
s
u
l
t
=
y
∗
y
∗
x
result=y*y*x
result=y∗y∗x;O(logN)
代码思路:
递归思路:非常简洁,看湿了. 要清楚,最后都会变成奇数,因为1%2是等于1的,就会进入奇数情况,然后再返回1. 有个难理解的地方,就是最后一行,x*x已经做了一次分治,然后进入下一层循环就是上面说的
y
∗
y
y*y
y∗y,偶数情况下,最后其实返回的就是
y
∗
y
∗
1
y*y*1
y∗y∗1,可以带
2
4
2^4
24进去理解一下。
非递归思路:关键是判断n是x的多少次方,如果n的二进制位是等于1的话,那么需要乘以x,即奇数情况。
代码:
递归:
class Solution:
def myPow(self, x: float, n: int) -> float:
if not n: #n=0,那么返回1
return 1
if n<0: #负数情况
return 1/self.myPow(x,-n)
if n%2: #奇数情况,有余数,即进入判断
return x * self.myPow(x,n-1) #1%2= 1
return self.myPow(x*x,n/2) #偶数情况,直接返回相乘结果
非递归写法:位运算
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0: #负数情况
x = 1/x
n=-n
pow = 1
while n:
if n&1: #如果二进制位为1,就是奇数&1等于1
pow *=x
x*=x #乘积
n >>=1 # n = n右移一位,即n=n/2
return pow
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
O(logN)