[LeetCode] 50. Pow(x, n)
题目链接 : https://leetcode-cn.com/problems/powx-n/
题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例:
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
思路:
思路一:库函数
思路二:倍降指数
这道题有点像求解斐波那契数列,所以可以用递归和迭代的方法,如下面两种方法,
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0 : return self.myPow(1 / x, -n)
if n == 0: return 1
if n == 1:
return x
return x * self.myPow(x, n - 1)
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0:
x = 1 / x
n = -n
if n == 0:
return 1
res = 1
for _ in range(n):
res *= x
return res
但是如果x = 1.00000,n = 2147483648,这就会超时,所以我们采用数学小技巧
比如\(2^{10} = {2^2}^5 = 4^5 = 4 ×{4^4} = 4 × 8^2 = ....\)大家一定发现这里面小技巧了,我们可以通过不断缩小指数,来降低复杂度.
关注我的的知乎专栏,了解更多的解题技巧,共同进步!
代码:
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0 : return self.myPow(1 / x, -n)
if n == 0: return 1
if n % 2 == 0:
return self.myPow(x*x, n//2)
else:
return x * self.myPow(x*x, n//2)
class Solution {
public double myPow(double x, int n) {
if(n == 0)
return 1;
if(n<0){
n = -n;
x = 1/x;
}
if (n == Integer.MIN_VALUE)
return myPow(x*x, -(n/2));
return (n%2 == 0) ? myPow(x*x, n/2) : x*myPow(x*x, n/2);
}
}
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0:
x = 1 / x
n = -n
if n == 0:
return 1
res = 1
while n :
if n % 2 == 0:
n //= 2
x *= x
else:
res *= x
n -= 1
return res