方法一即常用思路递归,注意基线条件即可,方法二参考力扣官方题解思路
方法一:快速幂 + 递归
解题思路
- n为奇数
x n = x n / 2 ∗ x n / 2 ∗ x x^{n} =x^{n/2}\ast x^{n/2}\ast x xn=xn/2∗xn/2∗x - n为偶数
x n = x n / 2 ∗ x n / 2 x^{n} =x^{n/2}\ast x^{n/2} xn=xn/2∗xn/2 - n为负数
x − n = ( 1 / x ) n x^{-n} =(1/x)^{n} x−n=(1/x)n - 基线条件为n等于0或1,分别为1和其自身
代码实现
func myPow(x float64, n int) float64 {
if n == 0 {
return 1
} else if n == 1 {
return x
} else if n < 0 {
n = -n
x = 1 / x
}
cur := myPow(x, n/2)
if n%2 == 0 {
return cur * cur
} else {
return cur * cur * x
}
}
力扣官方版本
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
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/powx-n/solutions/238559/powx-n-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:快速幂 + 迭代
解题思路
以x的69次方为例
x
→
x
2
→
x
4
→
x
8
(
x
)
→
x
17
→
x
34
(
x
)
→
x
69
x\to x^{2} \to x^{4} \to x^{8}(x) \to x^{17} \to x^{34}(x)\to x^{69}
x→x2→x4→x8(x)→x17→x34(x)→x69
69为奇数,第一次迭代需补乘一个x,最终结果为补乘一个x的2的0次方;17为奇数,第三次迭代需补乘一个x,最终结果中为补乘一个x的2的二次方,依此类推…总共迭代6次,第一个x在最终结果中为x的2的6次方,即x的64次方,1+4+64=69以上结果即如下规律:
69
:
1
→
0
→
0
→
0
→
1
→
0
→
1
69:1\to0 \to0 \to0 \to1 \to 0\to 1
69:1→0→0→0→1→0→1
69
=
2
6
+
2
2
+
2
0
69=2^{6} +2^{2} +2^{0}
69=26+22+20
x
69
=
x
2
6
∗
x
2
2
∗
x
2
0
x^{69} =x^{2^{6}} *x^{2^{2}} *x^{2^{0} }
x69=x26∗x22∗x20
代码实现
func myPow(x float64, n int) float64 {
if n == 0 {
return 1
}
if n == 1 {
return x
}
if n < 0 {
n = -n
x = 1 / x
}
res := 1.0
for n > 0 {
if n%2 == 1 {
res *= x
}
x *= x
n /= 2
}
return res
}
力扣官方版本
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 {
ans := 1.0
// 贡献的初始值为 x
x_contribute := x
// 在对 N 进行二进制拆分的同时计算答案
for N > 0 {
if N % 2 == 1 {
// 如果 N 二进制表示的最低位为 1,那么需要计入贡献
ans *= x_contribute
}
// 将贡献不断地平方
x_contribute *= x_contribute
// 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可
N /= 2
}
return ans
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/powx-n/solutions/238559/powx-n-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。