LeetCode 50. 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 次冪函數。git

示例 1:github

輸入: 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
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。ui

解題思路

思路1-對數運算與冪運算的對立邏輯

思路解析:對n進行以2爲底的對數運算,對x進行以x爲底的冪運算,遞歸進行,注意最後要進行符號處理:
一個例子:求2.0的10次方spa

  • 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:code

  • 這個例子中間只保留了一次不成對的狀況值,對於其餘的例子,可能中間要保留好幾回,但最終都是將這些值連乘起來才獲得最終結果;
  • 對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;
	}
}
相關文章
相關標籤/搜索