-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path0050_pow_x_n.py
More file actions
89 lines (72 loc) · 2.05 KB
/
0050_pow_x_n.py
File metadata and controls
89 lines (72 loc) · 2.05 KB
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
80
81
82
83
84
85
86
87
88
#------------------------------------------------------------------------------
# Questions 0050_pow_x_n.py
#------------------------------------------------------------------------------
# tags: #medium
'''
Implement pow(x, n), which calculates x raised to the power n (x**n).
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
'''
def pow(x, n):
ans = 1
for i in range(n):
ans = ans * x
return ans
#------------------------------------------------------------------------------
# Solutions
#------------------------------------------------------------------------------
from typing import *
from functools import reduce
class Solution:
'''
Brute Force
Time: O(N)
Space: O(1)
'''
def myPow(self, x: float, n: int) -> float:
ans = 1
for i in range(n):
ans = ans * x
return ans
class SolutionRecurFast:
'''
Fast Pow: Recursion
Time: O(log n)
Space: O(1)
Intuition: Given x^n to get x^2n we can (x^n)^2 instead of having to multiply
x by n more times. Using this idea, go backwards from n to find the half.
'''
def myPow(self, x: float, n: int) -> float:
def powHelper(x, n):
if n == 0:
return 1
half = powHelper(x,n // 2)
if n % 2 == 0:
return half * half
else:
return half * half * x
if n < 0:
x = 1 // x
n = -n
return powHelper(x,n)
#------------------------------------------------------------------------------
# Tests
#------------------------------------------------------------------------------
import unittest
class TestSolution(unittest.TestCase):
def test_simple(self):
x = 2.0000
n = 10
s = Solution()
self.assertEqual(s.myPow(x, n), 1024.0)
s = SolutionRecurFast()
self.assertEqual(s.myPow(x, n), 1024.0)
unittest.main(verbosity=2)