我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 50. Pow(x, n) 題目 實現 pow(x, n) , ...
我的LeetCode:https://leetcode-cn.com/u/ituring/
我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii
LeetCode 50. Pow(x, n)
題目
實現 pow(x, n) ,即計算 x 的 n 次冪函數。
示例 1:
輸入: 2.00000, 10
輸出: 1024.00000
示例 2:
輸入: 2.10000, 3
輸出: 9.26100
示例 3:
輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25
說明:
- -100.0 < x < 100.0
- n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/powx-n
著作權歸領扣網路所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思路
思路1-對數運算與冪運算的對立邏輯
思路解析:對n進行以2為底的對數運算,對x進行以x為底的冪運算,遞歸進行,註意最後要進行符號處理:
一個例子:求2.0的10次方
- 10/2得5餘數0,對應\((2*2)*(2*2)*(2*2)*(2*2)*(2*2)=4*4*4*4*4\)
- 5/2得2餘數1,對應\((4*4)*(4*4)*4=16*16*4\),這裡4需要額外保存最後再乘進去;
- 2/2得1餘數0,對應\(16*16=256\),上一步的4取走一個,每次只計算成對的因數;
- 1/2得0餘數1,此時只剩256,需要保留256與之前保留的乘起來,即這一步為\(256*4=1024\),計算完畢;
tips:
- 這個例子中間只保留了一次不成對的情況值,對於其他的例子,可能中間要保留好幾次,但最終都是將這些值連乘起來才得到最終結果;
- 對n的對數壓縮映射到對x的冪積放大上,效率很快
- 因為計算n的時候是忽略了正負號的,所以若n為負數,最終值需要取倒數;
演算法複雜度:
- 時間複雜度: $ {\color{Magenta}{\Omicron\left(logn\right)}} $
- 空間複雜度: $ {\color{Magenta}{\Omicron\left(1\right)}} $
演算法源碼示例
package leetcode;
/**
* @author ZhouJie
* @date 2020年2月2日 下午10:23:55
* @Description: 50. Pow(x, n)
*
*/
public class LeetCode_0050 {
}
class Solution_0050 {
/**
* @author: ZhouJie
* @date: 2020年2月4日 下午11:29:49
* @param: @param x
* @param: @param n
* @param: @return
* @return: double
* @Description: 1-對n進行對數運算,對x進行冪計算;
*
*/
public double myPow(double x, int n) {
boolean f = n > 0;
double y = 1.0;
while (n != 0) {
// 對n取對數的同時對x進行冪計算,若n不為2的倍數則補乘一次x;
if (n % 2 != 0) {
y *= x;
}
x *= x;
n /= 2;
}
return f ? y : 1 / y;
}
}