一. Pow(x, n)
Implement pow(x, n).
Difficulty:Medium
TIME:20MIN
解法一(遞歸)
這道題是求某個數的n次冪,按我們正常的思維來說,可能就是求n次乘法算得結果,時間複雜度爲
假設是求
因此,快速冪的要訣就是將求冪分治成爲兩個子問題,比如對於
- 如果n爲偶數,
xn =xn/2∗xn/2 - 如果n爲奇數,
xn =x∗xn/2∗xn/2
double myPow(double x, int n) {
if(n == 0)
return 1;
long m = n; //當n爲最小負數,翻轉可能會超出int的表示範圍,這裏簡單把int提升爲long
if(m < 0) {
m = -m;
x = 1 / x;
}
if(m % 2 == 0)
return myPow(x * x, m / 2);
else
return x * myPow(x * x, m / 2);
}
代碼的時間複雜度爲
解法二(迭代)
迭代的思想和遞歸類似,代碼如下:
double myPow(double x, int n) {
if(n == 0)
return 1;
long m = n;
if(m < 0) {
m = -m;
x = 1 / x;
}
double result = 1;
while(m) {
if(m % 2 != 0)
result *= x;
x *= x;
m /= 2;
}
return result;
}
代碼的時間複雜度爲