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