[LintCode]Wood Cut

http://www.lintcode.com/en/problem/wood-cut/

給定一組樹木,要求切割任意次之後相同長度的樹木個數大於等於k,求最長切割後的長度。如果沒有滿足條件的情況就返回-1.




二分最長樹木,模板牛逼!考慮溢出

public class Solution {
    /** 
     *@param L: Given n pieces of wood with length L[i]
     *@param k: An integer
     *return: The maximum length of the small pieces.
     */
    public int woodCut(int[] L, int k) {
        // write your code here
        int max = 0;
        // 考慮溢出情況
        long sum = 0;
        for (int l : L) {
            sum += l;
            max = Math.max(max, l);
        }
        if (sum < k) {
            return 0;
        }
        int beg = 1;
        int end = max;
        // 叼炸天的二分模板,beg和end都不用進行加減運算!!!
        while (beg + 1 < end) {
            int mid = beg + (end - beg) / 2;
            if (valid(mid, L, k)) {
                beg = mid;
            } else {
                end = mid;
            }
        }
        if (valid(beg, L, k)) {
            return beg;
        }
        return end;
    }
    private boolean valid(int target, int[] lens, int k) {
        int sum = 0;
        int cnt = 0;
        for (int l : lens) {
            cnt += (l / target);
        }
        return cnt >= k;
    }
}


發佈了363 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章