LeetCode No.50 Posted on 2021-03-10 | In OJ , LeetCode | | LeetCode第五十题题目描述现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 1234567891011121314151617181920示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25 提示:-100.0 < x < 100.0-231 <= n <= 231-1-104 <= xn <= 104 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879class Solution(object): def TimeOut(self, x, n): """ :type x: float :type n: int :rtype: float 核心思想: 1. 第一种方法,有一个测试用例超时了 如果n小于0的话,则使用1/x,重复n次 如果n大于0的话,则使用1*x 重复n次 如果n等于0的话,返回1 注意结果要保留5位小数, 结果类型为float 2. 第二种方法,采用快速幂方法 """ if n == 0: return 1.0000 result = float(1.0000) flag = True if n < 0: flag = False for i in range(abs(n)): if flag: result = result * x else: result = result / x return float(format(result,'.5f')) def myPow(self, x, n): """ :type x: float :type n: int :rtype: float 核心思想: 1. 第一种方法,有一个测试用例超时了 如果n小于0的话,则使用1/x,重复n次 如果n大于0的话,则使用1*x 重复n次 如果n等于0的话,返回1 注意结果要保留5位小数, 结果类型为float 2. 第二种方法,采用快速幂方法 快速幂算法能帮我们算出指数非常大的幂,传统的求幂算法之所以时间复杂度非常高(为O(指数n)), 就是因为当指数n非常大的时候,需要执行的循环操作次数也非常大。 所以我们快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。 这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。 3^10=3*3*3*3*3*3*3*3*3*3 //尽量想办法把指数变小来,这里的指数为10 3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3) 3^10=(3*3)^5 3^10=9^5 """ # 由于python递归和其他语言的递归调用方式不用,因此需要单独声明一个新的函数来进行递归调用 def call_pow(x,n): # 采用递归方式调用 if n == 0: return 1.0 elif n > 0 and n % 2 == 0: # 如果指数可以被2取余为0,则x变平方 指数除2 比如: 3^4 变成(3^2)^2 = (3*3)^2 return call_pow(x * x, n / 2) elif n > 0: return call_pow(x, n - 1)*x # 如果n不能被2整除,则减一 else: return 1 / call_pow(x, -n) # 单独处理n为负数的情况 return float(format(call_pow(x,n),'.5f'))if __name__ == '__main__': s = Solution() print(s.myPow(x = 8.88023, n = 3)) Hobby lead creation, technology change world. Post author: StriveZs Post link: www.strivezs.com/2021/03/10/LeetCode%E7%AC%AC%E4%BA%94%E5%8D%81%E9%A2%98/ Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.