zoukankan      html  css  js  c++  java
  • 竞赛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,就满足一束花。

  • 相关阅读:
    基于Spring的集群会话共享方案-spring session
    Tensorflow 模型线上部署
    Dijkstra算法
    BFS和DFS
    图的基本概念
    排序5
    排序4
    排序3
    排序2
    排序1
  • 原文地址:https://www.cnblogs.com/zhangzs000/p/13171372.html
Copyright © 2011-2022 走看看