起初拿到这个问题,感觉这丝毫不像是中等难度题,一个循环即可解决问题。大键盘一挥写出如下代码:
class Solution {
public:
double myPow(double x, int n) {
double sum;
int t;
if(n<0)
t=-n;
else
t=n;
sum = 1;
for(int i = 0; i<t; i++)
{
sum = sum * x;
}
if(n<0)
sum=1/sum;
return sum;
}
};
结果是我图样图森破了,提交结果是超出时间限制,看到样例自己都害怕这样做的复杂度,于是考虑如何降低复杂度。最终想到了这种可分治算法的一种通用解决思路:用迭代。
class Solution {
public:
double myPow(double x, int n) {
double sum;
//边界问题
if(n==-2147483648)
{
if(x==1||x==-1) return 1;
else return 0;
}
//递归思想:用于可分治类型的东西
if(n<0)
sum = 1/myPow(x,-n);
else if(n==0)
sum = 1;
else if(n==1)
sum = x;
else if(n==2)
sum = x*x;
else if(n%2 == 0)
{
double s = myPow(x,n/2);
sum = s*s;
}
else
{
double s = myPow(x,n/2);
sum = s*s*x;
}
return sum;
}
};
最终完成,复杂度成功降低。