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