50. Pow(x, n)
Total Accepted: 83619
Total Submissions: 299730
Difficulty: Medium
Implement pow(x, n).
二分法求快速幂,时间复杂度为O(logn)。
测试数据有各种负数,真是醉了
最初的AC代码:
class Solution {
public:
double myPow(double x, int n) {
if (0 == n || 1 == x) return 1;
if (-1 == x) {
if (n & 1)
return -1;
return 1;
}
if (-2147483648 == n) return 0;
double ret = 1;
int k = abs(n);
while (k) {
if (k & 1) {
ret *= x;
}
x *= x;
k >>= 1;
}
if (n > 0) return ret;
return 1 / ret;
}
};
改进后的AC代码:
class Solution {
public:
double myPow(double x, int n) {
if (0 == n) return 1;
if (INT_MIN == n) n += 2; //n绝对值比较大,加2避免溢出,也无伤大雅
double ret = 1;
int k = abs(n);
while (k) {
if (k & 1) {
ret *= x;
}
x *= x;
k >>= 1;
}
if (n > 0) return ret;
return 1 / ret;
}
};