这道题我一开始想的是最暴力的方法,也就是被除数一直减除数,之后使result++,直到被除数小于除数。然后果然超时了。后来看了题解中别人的方法,发现他们用的是倍增的方法,可以使复杂度瞬间降低。
假设被除数为12,除数为3,倍增的方法的思路如下:
long long result = 0;
long long doubledivr = divr; //用于倍增的除数
long long ans = 1;
while (divd >= divr) { //当被除数值大于等于除数时,一直循环
doubledivr = divr;
ans = 1;
while (divd >= doubledivr) { //如果当前倍增后的除数一直小于被除数,就一直循环
divd -= doubledivr; //被除数减去倍增的除数
result += ans;
ans += ans; //将ans进行倍增
doubledivr += doubledivr; //对除数进行倍增
}
}
最后总体的解决方案如下
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend == INT_MAX && divisor == -1) return INT_MAX;
long long divd = dividend, divr = divisor;
int flag = 1;//同号为1,异号为-1
if (divd < 0) {
divd = -divd;
flag = -flag;
}
if (divr < 0) {
divr = -divr;
flag = -flag;
}
long long result = 0;
long long doubledivr = divr;
long long ans = 1;
while (divd >= divr) {
doubledivr = divr;
ans = 1;
while (divd >= doubledivr) {
divd -= doubledivr;
result += ans;
ans += ans;
doubledivr += doubledivr;
}
}
if (flag == -1) result = -result;
if (result < INT_MIN || result > INT_MAX) return INT_MAX;
return result;
}
};