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

题目描述:

 

 

 

 提交:二分 O(nlogk)

class Solution:
    def minDays(self, bloomDay: List[int], m: int, k: int) -> int:
        minday = min(bloomDay)
        maxday = max(bloomDay)
        def findday(m,k,d):
            num = 0
            x = 0
            for i in range(len(bloomDay)):
                if bloomDay[i] <= d:
                    x += 1
                    if x >= k:
                        num += 1
                        x = 0
                else:
                    x = 0
            return num >= m

        l,r = minday,maxday
        while l < r:
            mid = (l + r) //2
            if findday(m,k,mid):
                r = mid
            else:
                l = mid + 1

        if l == r == maxday and not findday(m,k,l):
            return -1
        return r

优化:只对数组中存在的数进行二分

class Solution:
    def minDays(self,bloomDay,m,k):
        if m*k<=len(bloomDay):
            sortedBloomDays=sorted(set(bloomDay))
            le,ri=0,len(sortedBloomDays)-1
            bloomDay.append(int(1e9+7))
            def helper(n):
                ans=le=0
                for i,j in enumerate(bloomDay):
                    if j>n:
                        ans+=(i-le)//k
                        le=i+1
                return ans
            while le<ri:
                mid=(le+ri)>>1
                if helper(sortedBloomDays[mid])>=m:
                    ri=mid
                else:
                    le=mid+1
            return sortedBloomDays[le]
        return -1

 

posted @ 2020-06-17 20:20  oldby  阅读(295)  评论(0编辑  收藏  举报