LeetCode 29. 兩數相除
阿新 • • 發佈:2021-01-31
技術標籤:刷題
難度:中等。
標籤:數學,二分查詢。
第一反應是用減法暴力來做,肯定超時。
使用二分的思想,見遞迴函式。邊界值很容易出錯,要注意判斷。
正確解法:
class Solution {
int div(int a, int b){
if(a < b)return 0;
int n = b, m = 0, right = 1, left = 0;
while(n < a){
m = n;
left = right;
if(INT_MAX - n - n < 0)break;
n += n;
right += right;
}
if(n == a){
return right;
}
return left + div(a - m, b);
}
public:
int divide(int dividend, int divisor) {
if(divisor == 1)return dividend;
if(divisor == -1){
if (dividend == INT_MIN)return INT_MAX;
else return -dividend;
}
if(divisor == dividend)return 1;
if(divisor == INT_MIN)return 0;
int sign = 1, ans = 0;
if(dividend < 0 && divisor < 0){
if(dividend == INT_MIN){
ans = 1;
dividend -= divisor;
}
dividend = -dividend;
divisor = -divisor;
}
else if(divisor < 0 && dividend > 0){
sign = -1;
divisor = -divisor;
}
else if(dividend < 0 && divisor > 0){
sign = -1;
if(dividend == INT_MIN){
ans = 1;
dividend += divisor;
}
dividend = -dividend;
}
if(dividend < divisor){
if(sign > 0)return ans;
else return -ans;
}
ans += div(dividend, divisor);
if(sign < 0)return -ans;
return ans;
}
};