題目描述
實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。
輸入輸出
示例1:
輸入:2.00000 10
輸出:1024.00000
示例2:
輸入:2.10000 3
輸出:9.26100
示例3:
輸入:2.00000 -2
輸出:0.25000
解釋:2^-2 = 1/2^2 = 1/4 = 0.25
說明:
- -100.0< x <100.0
- n是32位有符號整數,其數值範圍是[-231,231 -1]。
算法思路(二分法)
- 當n是偶數時,x^n = (x2)(n/2)
- 當n是奇數時,x^n = x(x2)(n/2),相比偶數多出了一項x
代碼
package leetcode;
/**
* @author god-jiang
* @date 2020/3/10 19:41
*/
public class Power {
public double myPow(double x, int n) {
//避免當n爲最大值時,進行n=-n時數據越界出錯
long exponent = n;
if (n < 0) {
x = 1 / x;
exponent = -exponent;
}
double res = 1.0;
while (exponent != 0) {
//奇數多出了一項x
if ((exponent & 1) == 1) {
res = res * x;
}
//二分操作
x = x * x;
exponent = exponent >> 1;
}
return res;
}
}
通過截圖
複雜度分析
- 時間複雜度:O(logN)。跟二分操作的時間複雜度一樣
- 空間複雜度:O(1)。沒有引入額外的變量
ps:參考leetcode大佬Krahets的解答。