【LeeCode】1482. 制作 m 束花所需的最少天数 -- TODO

时间:2022-12-14 07:17:20

【题目描述】

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

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

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

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

​​​https://leetcode.cn/problems/minimum-number-of-days-to-make-m-bouquets/​


【示例】

【LeeCode】1482. 制作 m 束花所需的最少天数 -- TODO


【代码1】admin

 admin: 通过率  80/90

package com.company;
import java.util.*;

class Solution {
public int minDays(int[] bloomDay, int m, int k) {
// 如果 花不够,则直接返回 -1
if (m * k > bloomDay.length){
return -1;
}

int left = Arrays.stream(bloomDay).min().getAsInt();
int right = Arrays.stream(bloomDay).max().getAsInt();

while (left < right){
int mid = (right + left) / 2;
if (getDay(bloomDay, mid, m, k)){
right = mid;
}else {
left = mid + 1;
}
}
return left;
}

private boolean getDay(int[] bloomDay, int mid, int m, int k) {
int sum = 0; // 制作好的花个数
List<Integer> list = new ArrayList<>(); // 记录是否相邻K的花

for (int x : bloomDay) {
if (x <= mid){
list.add(x);
if (list.size() == k){
sum++;
list = new ArrayList<>();
}
}else {
list = new ArrayList<>();
if (sum > m) sum = 0; // 考虑 k=1的情况 单独的花
}
}
// 如果够数,则返回true
if (sum == m) return true;
return false;
}
}
public class Test {
public static void main(String[] args) {
int[] arr = {1,10,3,9,12,10,4,5,7,3,2};
int m = 3;
int k = 2;

System.out.println(new Solution().minDays(arr, m, k)); // 输出 9

int[] arr1 = {1,10,3,10,2};
int m1 = 3;
int k1 = 1;
System.out.println(new Solution().minDays(arr1, m1, k1)); // 输出 3

}
}


【代码2】

​学习参考​

【LeeCode】1482. 制作 m 束花所需的最少天数 -- TODO