时间复杂度
O
(
l
o
g
n
)
O(logn)
O(logn),空间复杂度
O
(
1
)
O(1)
O(1)
转成二进制解法
classSolution:defmyPow(self, x:float, n:int)->float:ifnot x:if n >=0:return0# x 为0时 直接输出0else:returnfloat("inf")"""
思路:
先转成二进制
然后类似于(二分)层层递进,求当前位置的结果
"""
key =False# 是否为负数if n <0:
key =True
n =-n
# 转二进制
res =[]# 存储的是 二进制的逆序while n:ifnot n%2:# 余数为0
res.append('0')else:
res.append('1')
n //=2
result =1for one in res:if one =='1':
result *= x
x *= x
return result ifnot key else1/result
当然,我们无需求出二进制的结果,可以直接边求边计算
下面分别给出 递归 和 迭代的代码
递归解法
classSolution:defmyPow(self, x:float, n:int)->float:defquickMul(N):if N ==0:return1.0
y = quickMul(N //2)return y * y if N %2==0else y * y * x
return quickMul(n)if n >=0else1.0/ quickMul(-n)
时间复杂度
O
(
l
o
g
n
)
O(logn)
O(logn),空间复杂度
O
(
l
o
g
n
)
O(logn)
O(logn),因为需要栈空间
迭代解法
classSolution:defmyPow(self, x:float, n:int)->float:if n <0:
x =1/x
n =-n
mid_res = x
res =1while n:if n%2:# == 1
res *= mid_res
n //=2
mid_res = mid_res*mid_res
return res
时间复杂度
O
(
l
o
g
n
)
O(logn)
O(logn),空间复杂度
O
(
1
)
O(1)
O(1)