Implement pow(x, n).
题目很简单,就是实现x的n次方运算:
首先要考虑到各种输入情况:
1)x=0 返回0直接退出
2) n=0 返回1直接推出
3)n<0 需要先求x的abs(n)次方,再取倒数
4)n=0,直接求解即可
另外,如果直接进行n次乘法,肯定超时想都不要想,
最初的想法是,对于任何一个数都可以用1+2+2^2+2^3+.......+2^n组成(不用证明了吧,大家都是学计算机的)
所以保存每个x^1,x^2,...,x^n,空间复杂读O(logn)然后对指数n进行拆分,进而进行相乘操作得到结果,以减少乘法执行的次数,当然这里我还没有考虑到最终结果溢出的情况,写完初始的代码后竟然出现MLE,仔细一分析原来并不需要保存中间结果,空间复杂度可以减少到O(1)
代码如下:
class Solution {
public:
double pow(double x, int n) {
if (x==0)
{
return 0;
}
if(n==0)
{
return 1;
}
double result=1.0;
double p=x;
//make sure expoment>0
int expoment=abs(n);
int st=1;
//keep the middle result
/* vector <double> powRel;
powRel.push_back(p);
while (st<=expoment)
{
st=st<<1;
powRel.push_back(p);
}*/
while (expoment>0)
{
if (expoment&1)
{
result*=p;
}
p=p*p;
expoment=expoment>>1;
}
if (n<0)
{
return (1.0/result);
}
return result;
}
};