Pow(x,n) = x^n
思路:
if(x<0) 结果的正负取决于n的奇偶
if(n<0) x的结果是倒数
希望把n当做正数处理。但是if(n == INT_MIN)时,取绝对值会越界,需要单独处理
n可以看成是以2为基地的一个正数 n=5 => n=101
第0位对应于2^0, 第1位对应于2^1, 第2位对应于2^2,...
而n又是x的指数项。所以对应于 x^1, x^2, x^4, x^8...
所以x就可以按照翻倍的计算,效率了。
注:如果要求严格还要判断越不越界, 因为有乘法。LeetCode中没有检查。
时间复杂度:
O(logn) 因为我们把na按位来算的。
若是Brute Force, x乘n次: O(n)
Code (C++):
#define DBL_EPSILON 2.2204460492503131E-16
#define DBL_MAX 1E+37
#define DBL_MIN 1E-37
class Solution {
public:
double myPow(double x, int n) {
if(x == 0) return 0;
if(n == 1) return x;
int sign = 1;
double res = 1;
if(x < 0 && n%2 == 1) sign = -1;
x = abs(x); //x在计算完符号以后就要取绝对值了,否则影响后面的
if(n < 0)
{
x = 1.0/x; //if(DBL_MAX > 1.0/x || 1.0/x > DBL_MIN) x = 1.0/x...
}
if(n == INT_MIN)
{
res = res*x;
n++;
}
n = abs(n);
while(n!=0)
{
if(n&1)
{
res = res*x; //if(DBL_MAX/x<res) return DBL_MAX;
}
x = x*x; // x^(2^1), x^(2^2),x^(2^3)
n >>= 1;
}
return res*sign;
}
};