Implement pow(x, n).
常见的方法有两种:
1、最常规的,用for循环做累乘,复杂度O(n);
2、二分法,把pow(x,n/2)存起来,复杂度O(logn)。
在OJ上,第一种方法超时,所以只能采用第二种方法。
这道题值得注意的有两点:
1、n的取值范围是全体整数(注意!不是全体正整数,不要陷入习惯误区,虽然我们常用的n都是正整数),这也意味着n可以取0或者负整数,所以要对n分情况讨论,当n取负整数时,直接用1.0/positive_pow(x,-n)计算即可;
2、对x的取值尽可能考虑周全,x是double,特殊情况有x=1.0;x=-1.0;这两种情况是OJ测试算例里必有的,如果遇到n非常大的情况,按常规算法,最后会出现Time Limited(超时)错误。同时,还要考虑当x=-1.0,n>0和x=-1.0,n<0两种特殊情况。
以下是AC的代码:
class Solution {
public:
double positive_pow(double x,int n){
if(n==0) return (double)1;
if(x==1.0||n==1) return x;
if(x==-1.0&&n%2==0) return 1.0;
if(x==-1.0&&n%2!=0) return -1.0;
if(n>1)
{
double b=pow(x,n/2);
if(n%2==0)
return b*b;
else
return b*b*x;
}
}
double pow(double x,int n){
if(n<0)
return 1.0/positive_pow(x,-n);
else
return positive_pow(x,n);
}
};