leetcode50. Pow(x, n)
使用快速幂+递归
- 如果n < 0: 则取反 1/ mypow(x,-n)
- 如果n为奇数:则一定能够提出来一个x,再次进行二分法
- 如果n为偶数:则可以化为myPow(x*x, n//2)
使用递归实现Python版:
class Solution(object):
def myPow(self, x, n):
if n == 0:
return 1
if n < 0:
return 1 / self.myPow(x,-n)
if n % 2:
return self.myPow(x,n-1)*x
return self.myPow(x*x,n//2)
使用递归实现Golang版:
func myPow(x float64, n int) float64 {
if n > 0 {
return quickMul(x,n)
}
return 1.0/quickMul(x,-n)
}
func quickMul(x float64,n int) float64 {
if n == 0 {
return 1
}
y := quickMul(x, n/2)
if n%2 == 0 {
return y*y
}
return y*y*x
}
使用快速幂+迭代
使用逆向思维,如果n为偶数时,pow(x,n) == pow(x*x, n/2)
当n/2为奇数时,pow(x*x
,n/2) = pow((x*x)*(x*x
),(x/2)-1)/2)* x*x
由此可见:我们不妨令一个x_value作为当前的pow(x,n)的底,逐步迭代,直到n = 0,循环结束。
迭代,Python实现:
class Solution:
def myPow(self, x: float, n: int) -> float:
res = 1
tmp = n if n > 0 else -n
x_value =x
while tmp > 0:
if tmp % 2 == 1: # 如果为奇数
res =res * x_value
x_value *= x_value
tmp = tmp // 2
return res if n > 0 else 1.0/res
迭代,Golang实现:
func myPow(x float64, n int) float64 {
if n > 0 {
return quickMul(x,n)
}
return 1.0 / quickMul(x,-n)
}
func quickMul(x float64,n int) float64 {
res:= 1.0
x_value := x
for n > 0 {
if n%2 == 1 { // 奇数时
res *= x_value
}
x_value *= x_value
n/=2
}
return res
}