1. 程式人生 > 實用技巧 >Leetcode29.兩樹相除

Leetcode29.兩樹相除

題目:29.兩樹相除
思路:搜尋答案,使用二分。題目限定不能使用乘除取模,那麼只能使用加減。最基礎的想法就是不斷的累加除數,直到累加的除數超過被除數時,前一個累加的除數就是結果。這種搜尋的過程可以使用二分方法。最開始的想法是設定一個數n,然後每累加除數(記作b),有n+=n; b+=b; 。然後當超過被除數(記作a)時(a < b),就開始減n。因為當下一次累加除數b會超過被除數a時,答案一定在[n, n+n]內。這樣做雖然可以,但又做加法又做減法,過程繁瑣=.=。而看題解時,知道可以使用迭代的過程代替減法步驟。讓被除數a減去現有的除數b(記作c,c=a-b),那麼就變成了求c被初始b整除的值m,又回到了原始的問題了,最後求得的答案就是n+m。
程式碼:

class Solution {
    public int divide(int dividend, int divisor) {
        long dividendL = Math.abs((long)dividend);
        long divisorL = Math.abs((long)divisor);
        int sign = dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0 ? -1 : 1;
        long t;
        return (t = sign * helper(dividendL, divisorL)) < Integer.MIN_VALUE || t > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)t;
    }

    private long helper(long a, long b){
        if(a < b) return 0;
        long n = 1, t = b;
        while(a >= (t+t)){
            n += n;
            t += t;
        }
        return n + helper(a - t, b);
    }
}

執行用時:1 ms, 在所有 Java 提交中擊敗了100.00%的使用者
記憶體消耗:35.5 MB, 在所有 Java 提交中擊敗了69.13%的使用者