1891. Cutting Ribbons - cocoder39/coco39_LC GitHub Wiki

1891. Cutting Ribbons

variant of binary search

O(len(ribbons) * log (max(ribbons)))

class Solution:
    def maxLength(self, ribbons: List[int], k: int) -> int:
        low, high = 1, max(ribbons)
        while low + 1 < high:
            mid = low + (high - low) // 2
            can = self.canCut(ribbons, k, mid)
            if can:
                low = mid
            else:
                high = mid
        
        if self.canCut(ribbons, k, high):
            return high
        if self.canCut(ribbons, k, low):
            return low
        return 0

    def canCut(self, ribbons, k, length):
        cnt = 0
        for ribbon in ribbons:
            cnt += ribbon // length
            if cnt >= k:
                return True
        return False