50.Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。
示例 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:快速幂 递归
import sun.text.normalizer.NormalizerBase.QuickCheckResult;
/*
* @lc app=leetcode.cn id=50 lang=java
*
* [50] Pow(x, n)
*/
// @lc code=start
class Solution {
public double myPow(double x, int n) {
// 快速幂运算 递归
// 时间复杂度:O(longn)
// 空间复杂度:O(logn)
long N = n;
return N > 0 ? quickMutil(x, N) : 1.0 / quickMutil(x, N);
}
private double quickMutil(double x, long n) {
if (n == 0) {
return 1.0;
}
double subResult = quickMutil(x, n / 2);
return n % 2 == 0 ? subResult * subResult : subResult * subResult * x;
}
}
题解2:快速幂 迭代
import sun.text.normalizer.NormalizerBase.QuickCheckResult;
/*
* @lc app=leetcode.cn id=50 lang=java
*
* [50] Pow(x, n)
*/
// @lc code=start
class Solution {
public double myPow(double x, int n) {
// 快速幂运算 迭代
// 时间复杂度:O(longn)
// 空间复杂度:O(1)
long power = n;
return power > 0 ? quickMutil(x, power) : 1.0 / quickMutil(x, power);
}
private double quickMutil(double x, long power) {
if (power == 0) {
return 1.0;
}
// 贡献的初始值为 x
double contrbute = x;
double ans = 1.0;
// 在对 power 进行二进制拆分的同时计算答案
while (power > 0) {
if (power % 2 == 1) {
// 如果 power 二进制表示的最低位为 1,那么需要计入贡献
ans *= contrbute;
}
// 将贡献不断地平方
contrbute *= contrbute;
// 舍弃 power 二进制表示的最低位,这样我们每次只要判断最低位即可
power /= 2;
}
return ans;
}
}