leetcode之50PowGolang
题目描述
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
算法
我算是发现了,题目越简单的时候,用常规的方法越容易超时,很大几率超时哦
例如在本题中,如果真的按照指数的值一次一次相乘,那么就超时了。
所以本题采用了所谓的快速幂的方式,其实很简答,例如需要求2的10次方,那么我们可以求2的一次方,然后2的二次方,然后再翻倍就是2的四次方,然后再翻倍就是2的八次方,并且我们记录一下中间结果,2的10次方就是2的8次方乘以2的2次方,所以我们在消耗了更多的内存的情况下,成功将本题的时间复杂度降低到了logN
代码
func myPow(x float64, n int) float64 {
if n == 0 {
return 1
}
if x == 1 {
return 1
}
if x == -1 {
if n%2 == 0 {
return 1
}
return -1
}
signFlag := false
if n < 0 {
signFlag = !signFlag
n = -n
}
res := float64(1)
resMap := map[int]float64{1: x}
exp := 1
for {
if exp*2 < n {
if _, ok := resMap[exp*2]; !ok {
resMap[exp*2] = resMap[exp] * resMap[exp]
}
exp *= 2
continue
}
res *= resMap[exp]
n -= exp
exp = 1
if n == 0 {
break
}
}
if signFlag {
res = float64(1) / res
}
return res
}
浙公网安备 33010602011771号