Leetcode 29 —— Divide Two Integers

博客介绍了如何在不使用乘除法和模运算的情况下,通过位运算来解决LeetCode第29题——Divide Two Integers的问题。作者提到最初的思路是反复减法,但时间复杂度高,然后提出了使用被减数左移的优化方法,将时间复杂度降低到O(logn),并给出了已通过的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

29. Divide Two Integers

My Submissions
Total Accepted: 62780  Total Submissions: 403300  Difficulty: Medium

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Subscribe to see which companies asked this question

Hide Tags
  Math Binary Search

题目要求:

不能使用乘除法和模操作 只能使用位运算和加减法


最开始想到的就是用被减去一直减去减数。。。  当然这样的时间复杂度不是最优的。


接着想到以2为基的数学形式表达,可以这样做: 减数一直左移 直到大于被减数。

这样是以2的幂次进行迭代,算法的时间复杂度为 O(logn)


上代码(已AC - 2016-03-24):

// 不能使用乘除法和模操作 只能使用位运算和加减法
int divide(int dividend, int divisor)
{
	// 边界判断
	if (divisor == 0 || (dividend == INT_MIN && divisor == -1))
		return INT_MAX;

	bool isNeg = (dividend < 0) ^ (divisor < 0);
	long long dvd = labs(dividend);
	long long dvs = labs(divisor);
	long long res = 0;
	while (dvd >= dvs)
	{
		long long tmp = dvs, mul = 1;
		while (dvd >= (tmp << 1))
		{
			tmp <<= 1;
			mul <<= 1;
		}
		dvd -= tmp;
		res += mul;
	}
	
	return (isNeg) ? -res : res;
}

另外,注意一下边界数据的判断,测试用例中有各种边界条件的数据。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值