(python刷題)leetcode 第29題:兩數相除

題目描述:
在這裏插入圖片描述

解題思路:
不能使用乘除法,最容易想到的就是使用加法,比如被除數爲10, 除數爲3,則使用循環對3進行累加,循環相加的結果依次爲6, 9, 12,由於9 <10<12那麼就找到了最後的結果爲3。但是這種方法的時間複雜度過高,它的時間複雜度爲o(dividend//divisor)。那麼怎麼降低時間複雜度呢。
我們可以使用每次循環都將除數翻倍的方法,比如對於被除數爲10, 除數爲3的情況,我們使用count表示除法結果。首先將3翻倍得到6,此時count=2,然後將6翻倍得到12,這時12>10,說明除法結果肯定是2加上某個數,那麼我們用10減去6的結果4作爲新的被除數,除數還是3,繼續算出一個新的count=1,然後更新被除數爲4-3=1,由於1<3,這時計算出的count=0,所以最後的除法結果爲這三次的結果相加,即爲3。我們採用遞歸的方法來實現以上操作即可。
另外就是還需要考慮出發結果溢出以及正負符號的情況,具體見代碼註釋。

複雜度分析:
由於每次循環將除數進行翻倍,即乘以2,所以時間複雜度爲 o(log(dividend/divisor))
空間複雜度爲o(1)

python代碼:

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        # 考慮除法結果溢出的情況
        if dividend == -(2 ** 31) and divisor == -1:
            return 2 ** 31 - 1
        # 記錄結果的符號
        flag = -1
        if (dividend > 0 and divisor > 0) or (dividend < 0 and divisor < 0):
             flag = 1
        dividend = abs(dividend)
        divisor = abs(divisor)
        result = self.func(dividend, divisor)

        return result if flag == 1 else -result
    
    def func(self, dividend, divisor):
        if dividend < divisor:
            return 0
        count = 1
        tmp = divisor
        while tmp + tmp <= dividend:
            count += count 
            tmp += tmp
        return count + self.func(dividend - tmp, divisor)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章