LeetCode No.50 | StriveZs的博客

LeetCode No.50

LeetCode第五十题

题目描述

现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
示例 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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class 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))
StriveZs wechat
Hobby lead  creation, technology change world.