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)
This 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
This 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