題目描述:
解題思路:
不能使用乘除法,最容易想到的就是使用加法,比如被除數爲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)