二分查找

1482. 制作 m 束花所需的最少天数

给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

1.暴力,对每一个天数判断是否能摘m束花,o(n²)

2.二分法,暴力的缺陷是需要遍历每一个可能的天数,其实本质上我们是在区间[0,max(arr)]中去找一个合适的天数,有序查找,很明显的二分法啦!

class Solution:
    def countDays(self, bloomDay, k, days):
    def minDays(self, bloomDay: List[int], m: int, k: int) -> int:
        if len(bloomDay) < m * k:
            return -1
        res=float('inf')
        for days in bloomDay:
            cnt = 0
            idx = 0
            for bd in bloomDay:
                if bd <= days:
                    idx += 1
                    if idx == k:
                        cnt += 1
                        idx = 0
                else:
                    idx = 0
            if cnt>=m:res=min(res,days)
        return res

class Solution:
    def countDays(self, bloomDay, k, days):
        # 计算成长天数为 days 的时候,最多能够摘到花束的数量
        cnt = 0
        idx = 0
        for bd in bloomDay:
            if bd <= days:
                idx += 1
                if idx == k:
                    cnt += 1
                    idx = 0
            else:
                idx = 0
        return cnt
    def minDays(self, bloomDay: List[int], m: int, k: int) -> int:
        if len(bloomDay) < m * k:
            return -1
        left, right = 0, max(bloomDay)
        while left < right:
            mid = (left + right) >> 1
            if self.countDays(bloomDay, k, mid) >= m:
                right = mid
            else:
                left = mid + 1
        return right

 

你可能感兴趣的:(Leetcode)