1891 cutting ribbons

https://leetcode.com/problems/cutting-ribbons/

class Solution {
    public int maxLength(int[] ribbons, int k) {
        int lo = 0;
        int hi = 0;
        for (int ribbon : ribbons) {
            hi = Math.max(ribbon, hi);
        }
        while (lo + 1 < hi) {
            int mid = lo + (hi - lo) / 2;
            if (canCut(ribbons, mid, k)) {
                lo = mid;
            } else {
                hi = mid;
            }
        }
        if (canCut(ribbons, hi, k)) {
            return hi;
        }
        return lo;
    }
    private boolean canCut(int[] nums, int len, int k) {
        if (len == 0) {
            return true;
        }
        int cnt = 0;
        for (int num : nums) {
            cnt += num / len;
        }
        return cnt >= k;
    }
}

binary search还蛮适合做这种求极值或者某个精确解的问题的,注意就是判断的部分可能很costly,这是正常的

Last updated