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

二分查找

解题思路

  1. 可以用于查找一个 有范围的 整数,就能想到是不是可以使用二分查找去解决这道问题;

  2. 这道题是对结果的二分,同 leetcode🧑‍💻 410. 分割数组的最大值 题解一致,只是换了种方式表达;

复杂度

  1. 时间复杂度:O(nlog(high − low)),其中遍历数组花费时间为 O(n),在 [high, low] 区间内二分花费的时间为 O(log(high − low))

  2. 空间复杂度:O(1)

代码实现

var minDays = function (bloomDay, m, k) {
    if (bloomDay.length < m * k) {
        return -1;
    }

    let left = Math.min(...bloomDay);
    let right = Math.max(...bloomDay);

    while (left < right) {
        let mid = left + Math.floor((right - left) / 2);

        if (check(bloomDay, k, mid) < m) {
            left = mid + 1; // 花束小于 m,需要增加花束的数量,即区间为 [mid+1,right]
        } else {
            right = mid; // 花束大于等于 m,需要减少花束的数量,即区间为 [mid,right]
        }
    }

    return left;
};

/**
 * @param { Array<number> } bloomDay 
 * @param { number } k 相邻的 k 朵花
 * @param { number } minDay 给定天数
 * @returns { number } 给定天数内 minDay 能采摘几束花
 */
function check(bloomDay, k, minDay) {
    let currLoop = 0; // 记录连续的花
    let num = 0; // 采摘花是几束花

    for (const item of bloomDay) {
        if (item <= minDay) {
            currLoop++; // 连续,记录 currLoop
            if (currLoop == k) {
                // 连续的花够几束
                num++;
                currLoop = 0;
            }
        } else {
            currLoop = 0; // 不连续,清零
        }
    }

    return num;
}
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 二分查找
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现