题目如下:
Implement pow(x, n).
分析如下:
看几个例子,
pow(3,4) = pow(3,2)*pow(3,2) = (pow(3,1)*pow(3,1)) * (pow(3,1)*pow(3,1))
pow(3,5) = pow(3,2)*pow(3,2)*pow(3,1) = (pow(3,1)*pow(3,1)) * (pow(3,1)*pow(3,1)) * pow(3,1)
核心思想是去不断地二分,对n进行二分。
我的代码:
class Solution {
public:
double power(double x, int n)
{
if (n == 0)
return 1;
double v = power(x, n / 2); //注意v为double型
if (n % 2 == 0)
return v * v;
else
return v * v * x;
}
double pow(double x, int n) {
if (n < 0)
return 1.0 / power(x, -n); //注意处理n<0的情况
else
return power(x, n);
}
};
update: 2014 - 12- 20
/*TLE
* 因为my_pow(x, n/2) * my_pow(x, n - n/2) 这个写法相对half = my_pow(x, n/2) , return half * half而言,每一层都额外计算了my_pow一次,所以TLE。
class Solution {
public:
double my_pow(double x, int n) {
if (n == 0) return 1.0;
if (n == 1) return x;
return my_pow(x, n/2) * my_pow(x, n - n/2);
}
double pow(double x, int n) {
if (n < 0)
return 1/my_pow(x, -n);
else
return my_pow(x, n);
}
};
*/
// 7ms
class Solution {
public:
double my_pow(double x, int n) {
if (n == 0) return 1.0;
if (n == 1) return x;
double half = my_pow(x, n/2); //NOTE1: double不要错写成了int. NOTE2: 保存中间变量half
if ((n & 1) == 0) //NOTE3: 位运算比if (n % 2 == 0)更快, &的优先级很低,所以需要括号。
return half * half; // 如果half是int 类型,可以优化为(half<<1)
else
return half * half * x;
}
double pow(double x, int n) {
if (n < 0) //NOTE4: 分情况讨论n的取值
return 1/my_pow(x, -n);
else
return my_pow(x, n);
}
};