1. 程式人生 > 其它 >LeetCode 29. 兩數相除

LeetCode 29. 兩數相除

技術標籤:刷題

難度:中等。
標籤:數學,二分查詢。
第一反應是用減法暴力來做,肯定超時。
使用二分的思想,見遞迴函式。邊界值很容易出錯,要注意判斷。

正確解法:

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; } };

在這裡插入圖片描述

在這裡插入圖片描述