Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
方法一:72ms
解题思路:不许用乘、除和求余实现两数的相除。那就只能用加和减了。正常思路是被除数一个一个的减除数,直到剩下的数比除数小为止,就得到了结果。这样是无法ac的,因为时间复杂度为O(n),比如一个很大的数除1,就很慢。这里我们可以用二分查找的思路,可以说又是二分查找的变种。
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
sign = 1
if (dividend > 0 and divisor < 0) or (dividend < 0 and divisor > 0):
sign = -1
if abs(dividend) < abs(divisor):
return 0
res = 0
a = abs(dividend)
b = abs(divisor)
sum= 0
count = 0
while a >= b:
sum = b
count = 1
while sum + sum <= a:
sum += sum
count += count
a -= sum
res += count
if sign == -1:
res = 0 - res
if res >= pow(2, 31)-1 and sign == 1: return pow(2, 31) - 1
if res >= pow(2, 31) and sign == -1: return -pow(2, 31)
return res
方法二:42ms
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
neg = (dividend >= 0) ^ (divisor >= 0)
dividend, divisor = abs(dividend), abs(divisor)
pos, base = 1, divisor
while base <= dividend:
pos <<= 1
base <<= 1
base >>= 1
pos >>= 1
res = 0
while pos > 0:
if base <= dividend:
res += pos
dividend -= base
base >>= 1
pos >>= 1
val = -res if neg else res
return 2 ** 31 -1 if val > 2 ** 31 -1 else val