29. 两数相除
解析:
快速乘 + 二分,快速乘和快速幂一个板子,只不过乘法变加法,最后看了眼题目解析,我觉得有个二分的地方说的很好,摘抄下来,供思考
long l = 0, r = 1000009;
while (l < r) {
long mid = l + r + 1 >> 1;
if (check(mid)) {
l = mid;
} else {
r = mid - 1;
}
}
为啥修改左边指针 l 的时候要进行 +1 操作?
「模板一」的 +1 操作主要是为了避免发生「死循环」,因为 >> 和 直接使用 / 一样,都属于「下取整」操作。
考虑 l = 0, r = 1 的简单情况,如果不 +1 的话,l + r >> 1 等于 0 + 1 / 2,l 仍然是 0,陷入死循环。
class Solution { public: long mul(long a, long b) { long ret = 0; while(b) { if (b & 1) ret += a; a += a; b >>= 1; } return ret; } int divide(int dividend, int divisor) { int min_inf = -2147483648, max_inf = 2147483647; int flag = 1; if (dividend < 0) flag *= -1; if (divisor < 0) flag *= -1; if (abs((long)divisor) == 1 && flag > 0 && dividend == min_inf) return max_inf; long target = abs((long)dividend); long dor = abs((long)divisor); long x = 0, y = target; while(x < y) { long mid = (x + y + 1) / 2; if (mul(mid, dor) <= target) x = mid; else y = mid - 1; } return flag * x; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号