Implement pow(x, n) where x is a float and n is an integer.
Solutions
Analysis: This problem is pretty simple. We can calculate it in O(n) time. But we can also easily do it in O(log n ) time.
I. Recursive Solution - O(log n)
class Solution:
# @param {float} x
# @param {integer} n
# @return {float}
def myPow(self, x, n):
if n == 0: return 1
result = self.myPow(x, n/2) if n>0 else self.myPow(1/x, -(n/2))
return result * result * (x if n % 2 == 1 else 1)
II. Non-recursive Solution - O(log n) time - O(log n) spaceThis solution use one additional array, which is quite obvious.
class Solution:
# @param {float} x
# @param {integer} n
# @return {float}
def myPow(self, x, n):
if n == 0: return 1
result = 1
a = []
t = n if n>0 else -n
while t > 0:
a.append(t % 2)
t = t >> 1
for i in range(1,len(a)+1):
result = result * result * (1 if a[-i] == 0 else x)
if n <0 : result = 1.0 / result
return result
III. Non-recursive Solution - O(log n) time - O(1) spaceThis is an improvement on the solution numbered II.
class Solution:
# @param {float} x
# @param {integer} n
# @return {float}
def myPow(self, x, n):
if n == 0: return 1
m = n
if n < 0:
m = -m
x = 1/x
result = 1
while m > 0:
if (m & 1) == 1:
result *= x
x *= x
m >>=1
return result
No comments:
Post a Comment