Leetcode之Divide Two Integers
2016-01-09 23:20
176 查看
题目描述:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
就是说不使用乘法、除法和取余,来得出除法操作的结果。
分析可知,我们可以使用移位运算和加减这些,暴力方法便是不断使用减法得到结果,时间复杂度是O(n).
深知肯定还有其他的解法,可惜脑子太笨,看了别人的方法反应了很久才明白,大概思路如下:
我们知道dividend = divisor * flag_0 * 2 ^ 0 + divisor * flag_1 * 2 ^1 + …… + divisor * flag_n * 2 ^n + diff,其中flag_n为0或1,diff < divisor,当然dividend得大于divisor。到这里就好办了:
我们首先一个n使d = divisor * 2 ^ n = divisor * bitcnt最接近(<=)dividend,即dividend = d + leftover;
当dividend >= d时,使dividend = dividend - d,result = result + bitcnt,否则进入步骤3,这一步的意思就是说2 ^ n 中的flag_n是0还是1;
d >>= 1, bitcnt >>= 1,d和bitcnt的操作很好理解,就是说2 ^ n这项考虑完了,接下来考虑2 ^ (n - 1)这项;
可知只要d >= divisor,我们就可以继续步骤2,直到d < divisor,即d为diff。
java代码如下:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
就是说不使用乘法、除法和取余,来得出除法操作的结果。
分析可知,我们可以使用移位运算和加减这些,暴力方法便是不断使用减法得到结果,时间复杂度是O(n).
深知肯定还有其他的解法,可惜脑子太笨,看了别人的方法反应了很久才明白,大概思路如下:
我们知道dividend = divisor * flag_0 * 2 ^ 0 + divisor * flag_1 * 2 ^1 + …… + divisor * flag_n * 2 ^n + diff,其中flag_n为0或1,diff < divisor,当然dividend得大于divisor。到这里就好办了:
我们首先一个n使d = divisor * 2 ^ n = divisor * bitcnt最接近(<=)dividend,即dividend = d + leftover;
当dividend >= d时,使dividend = dividend - d,result = result + bitcnt,否则进入步骤3,这一步的意思就是说2 ^ n 中的flag_n是0还是1;
d >>= 1, bitcnt >>= 1,d和bitcnt的操作很好理解,就是说2 ^ n这项考虑完了,接下来考虑2 ^ (n - 1)这项;
可知只要d >= divisor,我们就可以继续步骤2,直到d < divisor,即d为diff。
java代码如下:
public class Solution { public int divide(int dividend, int divisor) { long result = divideL(dividend, divisor); result = result > Integer.MAX_VALUE ? Integer.MAX_VALUE : result; return (int)result; } public long divideL(long dividend, long divisor){ if(divisor == 1) return dividend; if(divisor < 0) return -divideL(dividend, -divisor); if(dividend < 0) return -divideL(-dividend, divisor); if(divisor > dividend) return 0; if(divisor == 0) return Integer.MAX_VALUE; long copyDivisor = divisor; int bitcnt = 1; long result = 0; while(copyDivisor < dividend){ copyDivisor <<= 1; bitcnt <<= 1; } if(dividend < copyDivisor){ copyDivisor >>= 1; bitcnt >>= 1; } while(copyDivisor >= divisor){ if(dividend >= copyDivisor){ dividend -= copyDivisor; result += bitcnt; } copyDivisor >>= 1; bitcnt >>= 1; } return result; } }该解法的时间复杂度为O(logN);
相关文章推荐
- Python pip 更新问题汇总
- 《穆斯林的葬礼》—— 读后总结
- 刷爆美国朋友圈的超燃短片:年轻人为什么要奋斗?
- POJ 3525 Most Distant Point from the Sea 半平面交判多边形存在
- oc文件操作学习笔记
- tyvj校门外的树2
- ViewHolder的简洁写法
- gulp简单入坑介绍
- ROS3—创建包
- asp.net页面回传与js调用服务端事件、PostBack的原理详解
- 广告View效果学习
- 响应者链的事件传递过程
- 【WEB前端】2.CSS定位相关
- 归并排序思路及算法实现
- Android 6.0 Permission权限机制
- 添加了ssh框架后突然不能访问页面了
- 用android view中的tag传送数据
- servlet-1 web工程结构
- linux qt 根文件系统制
- 【iCore3 双核心板】例程二十八:FSMC实验——读写FPGA