中心思想并不难,递归相乘就可以了,主要是对一些特殊情况的考虑。
1、n=0
2、n=INT_MAX
3、n=INT_MIN
4、n<0
递归的复杂度为ON,采用二分法可以把复杂度降到OlogN
class Solution {
public:
double myPow(double x, int n) {
double res=1.0;//这里要定义成double啊喂
if(n==INT_MIN){
if(x==1) return x;
else if(x==-1) return -x;
else return 0;
}//一开始只用INT_MAX判断,2,2147483648这个测试用例怎么都过不了,后来想想,因为2147483648不管正还是负都是INT_MIN啊
if(n==INT_MAX){
if(x==1||x==-1) return x;
else return 0;
}
if(n==0) return 1.0;//考虑n=0的情况
if(n<0) return 1.0/pow(x,-n);//考虑n<0的情况
double half=pow(x,n>>1);//将复杂度从O(N)降到O(log(N)
if(n%2==0) return half*half;
else return half*half*x;
}
};