题目

image.png

思路

  • 典型的二分,我们可以知道如果mid天能够得到m组k束花,那么比mid大的所有天数都是可以的,我们现在就要看能否在更少的天数获得m*k朵花。

    代码

    1. //2.二分法
    2. public int minDays(int[] bloomDay, int m, int k) {
    3. int len = bloomDay.length, size = m * k;
    4. if (len < size) return -1;
    5. int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
    6. for (int day : bloomDay) {
    7. min = Math.min(min, day);
    8. max = Math.max(max, day);
    9. }
    10. while (min < max) {
    11. int mid = (min + max) / 2;
    12. int count = getCount(bloomDay, k, mid);
    13. if (count >= m) {
    14. max = mid;
    15. } else {
    16. min = mid + 1;
    17. }
    18. }
    19. return min;
    20. }
    21. //统计在不同天数下,连续能满足的情况
    22. public int getCount(int[] bloomDay, int k, int mid) {
    23. int count = 0, res = 0;
    24. for (int day : bloomDay) {
    25. count = day <= mid ? count + 1 : 0;
    26. if (count == k) {
    27. count = 0;
    28. res++;
    29. }
    30. }
    31. return res;

    制作m束花所需的最少天数
    [同系列]爱吃香蕉的珂珂
    [同系列]分割数组的最大值