返回介绍

solution / 1400-1499 / 1482.Minimum Number of Days to Make m Bouquets / README_EN

发布于 2024-06-17 01:03:19 字数 5952 浏览 0 评论 0 收藏 0

1482. Minimum Number of Days to Make m Bouquets

中文文档

Description

You are given an integer array bloomDay, an integer m and an integer k.

You want to make m bouquets. To make a bouquet, you need to use k adjacent flowers from the garden.

The garden consists of n flowers, the ith flower will bloom in the bloomDay[i] and then can be used in exactly one bouquet.

Return _the minimum number of days you need to wait to be able to make _m_ bouquets from the garden_. If it is impossible to make m bouquets return -1.

 

Example 1:

Input: bloomDay = [1,10,3,10,2], m = 3, k = 1
Output: 3
Explanation: Let us see what happened in the first three days. x means flower bloomed and _ means flower did not bloom in the garden.
We need 3 bouquets each should contain 1 flower.
After day 1: [x, _, _, _, _]   // we can only make one bouquet.
After day 2: [x, _, _, _, x]   // we can only make two bouquets.
After day 3: [x, _, x, _, x]   // we can make 3 bouquets. The answer is 3.

Example 2:

Input: bloomDay = [1,10,3,10,2], m = 3, k = 2
Output: -1
Explanation: We need 3 bouquets each has 2 flowers, that means we need 6 flowers. We only have 5 flowers so it is impossible to get the needed bouquets and we return -1.

Example 3:

Input: bloomDay = [7,7,7,7,12,7,7], m = 2, k = 3
Output: 12
Explanation: We need 2 bouquets each should have 3 flowers.
Here is the garden after the 7 and 12 days:
After day 7: [x, x, x, x, _, x, x]
We can make one bouquet of the first three flowers that bloomed. We cannot make another bouquet from the last three flowers that bloomed because they are not adjacent.
After day 12: [x, x, x, x, x, x, x]
It is obvious that we can make two bouquets in different ways.

 

Constraints:

  • bloomDay.length == n
  • 1 <= n <= 105
  • 1 <= bloomDay[i] <= 109
  • 1 <= m <= 106
  • 1 <= k <= n

Solutions

Solution 1

class Solution:
  def minDays(self, bloomDay: List[int], m: int, k: int) -> int:
    if m * k > len(bloomDay):
      return -1

    def check(day: int) -> bool:
      cnt = cur = 0
      for bd in bloomDay:
        cur = cur + 1 if bd <= day else 0
        if cur == k:
          cnt += 1
          cur = 0
      return cnt >= m

    left, right = min(bloomDay), max(bloomDay)
    while left < right:
      mid = (left + right) >> 1
      if check(mid):
        right = mid
      else:
        left = mid + 1
    return left
class Solution {
  public int minDays(int[] bloomDay, int m, int k) {
    if (m * k > bloomDay.length) {
      return -1;
    }
    int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
    for (int bd : bloomDay) {
      min = Math.min(min, bd);
      max = Math.max(max, bd);
    }
    int left = min, right = max;
    while (left < right) {
      int mid = (left + right) >>> 1;
      if (check(bloomDay, m, k, mid)) {
        right = mid;
      } else {
        left = mid + 1;
      }
    }
    return left;
  }

  private boolean check(int[] bloomDay, int m, int k, int day) {
    int cnt = 0, cur = 0;
    for (int bd : bloomDay) {
      cur = bd <= day ? cur + 1 : 0;
      if (cur == k) {
        cnt++;
        cur = 0;
      }
    }
    return cnt >= m;
  }
}
class Solution {
public:
  int minDays(vector<int>& bloomDay, int m, int k) {
    if (m * k > bloomDay.size()) {
      return -1;
    }
    int mi = INT_MIN, mx = INT_MAX;
    for (int& bd : bloomDay) {
      mi = min(mi, bd);
      mx = max(mx, bd);
    }
    int left = mi, right = mx;
    while (left < right) {
      int mid = left + right >> 1;
      if (check(bloomDay, m, k, mid)) {
        right = mid;
      } else {
        left = mid + 1;
      }
    }
    return left;
  }

  bool check(vector<int>& bloomDay, int m, int k, int day) {
    int cnt = 0, cur = 0;
    for (int& bd : bloomDay) {
      cur = bd <= day ? cur + 1 : 0;
      if (cur == k) {
        ++cnt;
        cur = 0;
      }
    }
    return cnt >= m;
  }
};
func minDays(bloomDay []int, m int, k int) int {
  if m*k > len(bloomDay) {
    return -1
  }
  mi, mx := 0, 1000000000
  for _, bd := range bloomDay {
    mi = min(mi, bd)
    mx = max(mx, bd)
  }
  left, right := mi, mx
  for left < right {
    mid := (left + right) >> 1
    if check(bloomDay, m, k, mid) {
      right = mid
    } else {
      left = mid + 1
    }
  }
  return left
}

func check(bloomDay []int, m, k, day int) bool {
  cnt, cur := 0, 0
  for _, bd := range bloomDay {
    if bd <= day {
      cur++
    } else {
      cur = 0
    }
    if cur == k {
      cnt++
      cur = 0
    }
  }
  return cnt >= m
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文