intleft=1, right = Integer.MAX_VALUE, ans = 0; while (left <= right) { // 注意溢出, 并且不能使用除法 intmid= left + ((right - left) >> 1); booleancheck= quickMul(divisor, mid, dividend); if (check) { ans = mid; // 注意溢出 if (mid == Integer.MAX_VALUE) { break; } left = mid + 1; } else { right = mid - 1; } }
return rev ? -ans : ans; }
// 快速乘法 publicbooleanquickMul(int y, int z, int x) { // x 和 y 是负数,z 是正数 // 需要判断 z * y >= x 是否成立 intresult=0, add = y; while (z != 0) { if ((z & 1) != 0) { // 需要保证 result + add >= x if (result < x - add) { returnfalse; } result += add; } if (z != 1) { // 需要保证 add + add >= x if (add < x - add) { returnfalse; } add += add; } // 不能使用除法 z >>= 1; } returntrue; }
时间复杂度:O(log^2C)*,其中 C 表示 32 位整数的范围。二分查找的次数为 *O(logC)*,其中的每一步我们都需要 *O(logC) 使用「快速乘」算法判断 Z × Y ≥ X 是否成立,因此总时间复杂度为 *O(log^2C)*。