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
}
posted @ 2020-11-23 11:48  胖胖咩  阅读(109)  评论(0)    收藏  举报