[LeetCode] 50. Pow(x, n)
Posted qiu_jiaqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 50. Pow(x, n)相关的知识,希望对你有一定的参考价值。
题目描述
实现 pow(x, n)
,即计算 x 的 n 次幂函数。
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [?2^31^, 2^31^ ? 1] 。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: \(2^-2\) = \(1/2^2\) = 1/4 = 0.25
分析与代码
- 这题直接用循环暴力相乘,肯定谁都能想出来,但这道是中等题,就不会这么简单,暴力法是会超时的。当然,直接循环暴力相乘也要注意幂为负数的时候。
- 题目分类在二分,很自然就想到了\(x^n = (x^n/2)^2\)。
解法一、暴力
- 注意幂为负数的时候,这里是不管正负数,先算出来,最后在判断正负,负数就取倒数。
- 也可以先作处理,把 x 赋值为 1/x,把 n 取反,这样就可以直接算。
- 注意:int 的最小值取反后会超出 int 的表示范围,使用 long。
代码:
class Solution
public double myPow(double x, int n)
double result = 1;
for (long i = 0; i < Math.abs(n); i++)
result *= x;
return n > 0 ? result : 1 / result;
解法二、快速幂(递归)
- 当 n 为偶数时,\(x^n = (x^n/2)^2\),但当 n 为奇数时,会少乘了一次 x,即应为\(x^n = (x^n/2)^2 * x\)。
- 奇怪,不转为 long 好像也能过,测试用例删除了幂为 int 的最小值?
代码:
class Solution
public double fastPow(double x, long n)
if (n == 0)
return 1;
double sqrt = fastPow(x, n / 2);
if ((n & 1) == 0)
return sqrt * sqrt;
return sqrt * sqrt * x;
public double myPow(double x, int n)
long num = n;
if (n < 0)
x = 1 / x;
num = -num;
return fastPow(x, num);
解法三、快速幂(迭代)
- 思路其实和递归一样,只是递归是拆分的方式,迭代是累积的方式。
代码:
class Solution
public double myPow(double x, int n)
double result = 1;
double product = x;
for (int i = n; i != 0; i /= 2)
if ((i & 1) != 0)
result *= product;
product *= product;
return n > 0 ? result : 1 / result;
小结
这道题主要考查二分,幂运算的快速幂运算。
也需要注意 int 的最小值取反后会超出 int 范围的问题,与补码知识相关。
以上是关于[LeetCode] 50. Pow(x, n)的主要内容,如果未能解决你的问题,请参考以下文章