竞赛193

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

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

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

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

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

示例 1:

输入:bloomDay = [1,10,3,10,2], m = 3, k = 1
输出:3
解释:让我们一起观察这三天的花开过程,x 表示花开,而 _ 表示花还未开。
现在需要制作 3 束花,每束只需要 1 朵。
1 天后:[x, _, _, _, _]   // 只能制作 1 束花
2 天后:[x, _, _, _, x]   // 只能制作 2 束花
3 天后:[x, _, x, _, x]   // 可以制作 3 束花,答案为 3

示例 2:

输入:bloomDay = [1,10,3,10,2], m = 3, k = 2
输出:-1
解释:要制作 3 束花,每束需要 2 朵花,也就是一共需要 6 朵花。而花园中只有 5 朵花,无法满足制作要求,返回 -1 。

示例 3:

输入:bloomDay = [7,7,7,7,12,7,7], m = 2, k = 3
输出:12
解释:要制作 2 束花,每束需要 3 朵。
花园在 7 天后和 12 天后的情况如下:
7 天后:[x, x, x, x, _, x, x]
可以用前 3 朵盛开的花制作第一束花。但不能使用后 3 朵盛开的花,因为它们不相邻。
12 天后:[x, x, x, x, x, x, x]
显然,我们可以用不同的方式制作两束花。

示例 4:

输入:bloomDay = [1000000000,1000000000], m = 1, k = 1
输出:1000000000
解释:需要等 1000000000 天才能采到花来制作花束

示例 5:

输入:bloomDay = [1,10,2,9,3,8,4,7,5,6], m = 4, k = 2
输出:9

提示:

  • bloomDay.length == n
  • 1 <= n <= 10^5
  • 1 <= bloomDay[i] <= 10^9
  • 1 <= m <= 10^6
  • 1 <= k <= n
/**
 * @param {number[]} bloomDay
 * @param {number} m
 * @param {number} k
 * @return {number}
 */
var minDays = function(bloomDay, m, k) {
    let s = m*k;
    let len = bloomDay.length;
    if(len<s) return -1;
    let ds= [];
    let map = new Map();
    bloomDay.forEach((b, i)=>{
        if(!map.has(b)){
            ds.push(b);
            map.set(b, [i])
        }else{
            let a = map.get(b);
            a.push(i)
            map.set(b, a)
        }
    })
    let arr = new Array(len).fill(0);
    ds.forEach(d=>{
        let a = map.get(d);
        a.forEach(a=>{
            arr[a] = 1
        })
        while(a.length>=k){
            
           
           
            
        }
    })
    
};

当时就是到了,连续k个花开着。就是遍历的比较乱,后来又优化删了,后来又遍历就不知怎么遍历了。还剩下10几分钟,懒得写了。

/**
 * @param {number[]} bloomDay
 * @param {number} m
 * @param {number} k
 * @return {number}
 */

var minDays = function(bloomDay, m, k) {
    let mark = [];
    const check=(bloomDay, m, k, day)=> {
        let pre = -1;
        for(let i = 0; i < bloomDay.length; i++) {
            mark[i]= bloomDay[i] <= day;
            if(mark[i] == true) {
                if(i - pre >= k) {
                    if(--m == 0) {
                        return true;
                    }
                    pre = i;
                }
            } else {
                pre = i;
            }
        }
        return false;
    }
    let L = 1, R = 1000000000;
    let anw = -1;
    while(L <= R) {
            let mid = (L+R)>>1;
            if(check(bloomDay, m, k, mid)) {
                anw = mid;
                R = mid-1;
            } else {
                L = mid+1;
            }
        }
    return anw;
};

他这个遍历连续k个是有个索引记录最近一个“不满足条件的”,每次满足条件都要判断“当前索引-最近不满足条件的”看差值是否为>=k,如果>=k,就满足一束花。

猜你喜欢

转载自www.cnblogs.com/zhangzs000/p/13171372.html