Binary Search (Brute Force solution)

class Solution:
    def minDays(self, A: List[int], m: int, k: int) -> int:
        """
        constrains: (1) len(A) >= m*k (2)  adjacent k flowers => after t, there are m*k flowers and each bunch has k adjecent flowers 
        tc O(Nlg(maxA))  sc O(1)
        """
        
        def cntBouquet(t:int,A:List[int])->int:
            flowers =  bouquet = 0
            for a in A:
                if k != 1:
                    if a <= t:
                        flowers += 1
                    else:
                        bouquet += flowers//k 
                        flowers = 0
                else:
                    bouquet += (a<=t)
            bouquet += flowers//k #  there are remaining flowers 
            #print(f'at day {t} there are {bouquet} bunches')
            return bouquet
        if len(A) < m*k:
            return -1
        l,r = min(A),max(A)+1
        while l < r:
            mid = l + (r-l)//2
            if cntBouquet(mid,A) < m: # mid days is small 
                l = mid + 1 
            else:
                r = mid
        return r

TODO tc O(N) solution by sorting refer