2018-12-13

LeetCode 50. Pow(x, n)

Description

Implement pow(x, n), which calculates x raised to the power n (xn).

Example 1: Input: 2.00000, 10 Output: 1024.00000
Example 2: Input: 2.10000, 3 Output: 9.26100
Example 3: Input: 2.00000, -2 Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25

Note:

-100.0 < x < 100.0
n is a 32-bit signed integer, within the range [?231, 231 ? 1]

描述

實現(xiàn)pow(x,n),即計算x的n次方

思路

  • 拿到這道題第一個想到的是循環(huán),但是循環(huán)顯然不是這道題考察的重點,而且,在此題中,采用循環(huán)(或者遞歸)會超時
  • 此題主要考察二分法
  • 我們計算xn時(以計算28說明),如果采用循環(huán)需要進行乘法運算約8(O(n))次,但是如果使用二分法,計算2*2得到4,計算4*4得到16,計算16*16得到245,只需要3(log2(8))次
  • 即28=(((22)2)2)
  • pow(x,n)中,我們每次讓x自乘一次,n就可以減半,這里要注意奇數(shù)的情況,如果n是奇數(shù),需要在結(jié)果中自乘一下當前的x,不然會少一次x
class Solution:
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        # 如果n等于0,則不論x為何值,返回1
        if n == 0:
            return 1
        # 如果n為負數(shù),則轉(zhuǎn)換為(1/x)^(-n)的形式
        if n < 0:
            x = 1/x
            n = -n
        # 初始化res為1
        res = 1
        while n > 1:
            # 如果n為奇數(shù),res則需要乘以x一次
            if n % 2:
                res *= x
            # x自乘一次
            x *= x
            # n整除2
            n //= 2
        return res*x
  • 源代碼文件在這里
  • ?本文首發(fā)于何睿的博客,歡迎轉(zhuǎn)載,轉(zhuǎn)載需保留文章來源,作者信息和本聲明.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容