[leetcode] 29. Divide Two Integers 解题报告
来源:互联网 发布:长波电台事件 知乎 编辑:程序博客网 时间:2024/05/23 12:15
题目链接:https://leetcode.com/problems/divide-two-integers/
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路:一个数除以被除数的本质就是包含多少个被除数.因此我们可以利用乘或位运算将被除数不断变大,直至找到看将被除数放大多少倍可以得到除数.举个栗子:100 / 5
1. 将5乘以2,得到10,而100 > 10,说明100包含更多的5
2.将10乘以2,得到20,100 > 20,因此还可以继续乘
3.将20乘以2,得到40,100 > 40
4.将40乘以2,得到80,100 > 40
5.将80乘以2,得到160,100 < 160
在此之前,我们对除数的放大倍数是以指数方式的,这样可以快速的找到一个其商的一个上界,然后将100-80剩下的作为被除数继续做如上操作.
我们也可以不用指数增长的方式来做,也就是一次增加一个被除数,最终也可以得到结果,但是这种方式的时间复杂度是O(n),而指数增长被除数的时间复杂度是O(log n),其效率相差极大.
还有一个会产生溢出情况的是,当除数是INT_MIN, 而被除数是-1的时候,因为负数的最小值比整数的最大值绝对值大1,因此需要注意这种情况.
代码如下:
class Solution {public: int divide(int dividend, int divisor) { if(dividend==INT_MIN && divisor ==-1) return INT_MAX; if(dividend ==0) return 0; long ans =0, nums1=labs(dividend), nums2=labs(divisor); while(nums2 <= nums1) { int cnt = 1; while((nums2 << cnt) <= nums1) cnt++; ans += (1<<(cnt-1)), nums1 -= (nums2<<(cnt-1)); } return (dividend>0 ^ divisor>0)?-ans:ans; }};
0 0
- [leetcode] 29. Divide Two Integers 解题报告
- [Leetcode] 29. Divide Two Integers 解题报告
- [LeetCode] Divide Two Integers 解题报告
- Divide Two Integers LeetCode 解题报告
- [leetcode]29. Divide Two Integers@Java解题报告
- Leetcode #29 Divide Two Integers 整数相除 解题报告
- Divide Two Integers ——解题报告
- [leetcode javascript解题]Divide Two Integers
- leetcode解题方案--028--Divide Two Integers
- [LeetCode]29.Divide Two Integers
- LeetCode --- 29. Divide Two Integers
- LeetCode 29.Divide Two Integers
- [Leetcode] 29. Divide Two Integers
- 【leetcode】29. Divide Two Integers
- *LeetCode 29. Divide Two Integers
- leetcode 29. Divide Two Integers
- leetcode 29. Divide Two Integers
- [LeetCode]29. Divide Two Integers
- 【杭电】[2042]不容易系列之二
- 【NYOJ】[255]C小加 之 随机数
- 【NYOJ】[799]兰州烧饼
- 深入浅出spi驱动之控制器驱动
- linux固件接口request_firmware
- [leetcode] 29. Divide Two Integers 解题报告
- LintCode:Add Two Numbers
- 条款
- 【12】AutoCompleteTextView——自动完成文本框
- 《Hadoop:The Definitive Guide 4th Edition》Chapter 17 Hive——B部分
- zoj2112 树状数组+主席树 区间动第k大
- [leetcode] 215. Kth Largest Element in an Array 解题报告
- poj3580 splay树 REVOVLE循环
- [BZOJ 1941]Hide and Seek