(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值