贪⼼心算法之445 分配饼⼲干

57 阅读2分钟

什么是贪心算法

贪心算法是一种常用的算法思想,它是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解的算法。

贪心算法通常分为两种类型:

  1. 基于贪心策略的优化问题:该类问题中,需要对某个目标函数进行最大化或最小化的优化,而目标函数通常可以分解为若干个子问题,且每个子问题的最优解可以直接得到,因此我们可以采取贪心策略,即在每个子问题中都选择当前最优解,最终得到全局最优解。
  2. 基于贪心思想的组合优化问题:该类问题中,需要从一个集合中选择一部分元素,使得这些元素满足某些条件,并且达到某个优化目标。在这种问题中,我们也可以采取贪心思想,即在每一步中都选择当前最优的元素,最终得到一个可行解或最优解。

贪心算法的优点是简单、高效,容易实现和调试。但是,贪心算法不能保证得到全局最优解,因此在某些情况下可能会得到次优解或不可行解。因此,在使用贪心算法时需要注意问题的特殊性和局限性,确保问题可以适用贪心算法。

  1. 题⽬目描述
有⼀一群孩⼦子和⼀一堆饼⼲干,每个孩⼦子有⼀一个饥饿度,每个饼⼲干都有⼀一个⼤大⼩小。每个孩⼦子只能吃最多⼀一个饼⼲干,且只有饼⼲干的⼤大⼩小⼤大于孩⼦子的饥饿
度时,这个孩⼦子才能吃饱。求解最多有多少孩⼦子可以吃饱。

例子

输⼊入两个数组,分别代表孩⼦子的饥饿度和饼⼲干的⼤大⼩小。输出最多有多少孩⼦子可以吃饱的数量量。
Input: [1,2], [1,2,3]  
Output: 2 
在这个样例例中,我们可以给两个孩⼦子喂[1,2][1,3][2,3]这三种组合的任意⼀一种。
  1. 思考 1

这⾥里里很明显是属于贪⼼心算法,优先把饥饿度最⼩小的孩⼦子⽤用最⼩小的饼⼲干喂饱,⼀一定可以得到最多的。

  1. 实现
export default (childrens, cookies) => {

    if (!childrens || childrens.length === 0) return 0; childrens.sort();  
        cookies.sort();  
        // 最多可以有多少孩⼦子

        letres=0;  
        // 已经分配的饼⼲干索引  
        let cookiesIndex = 0;  
    // 优先使⽤用最⼩小的饼⼲干喂饱饥饿最下的孩⼦子 
    
    for (let i = 0; i < childrens.length; i++) {

        for (let j = cookiesIndex; j < cookies.length; j++) { if (cookies[j] >= childrens[i]) {

        res++;  
        cookiesIndex = j + 1; break;

        } 
     }

  }
 return res; 
};

算法时间复杂度 O(childrens.length*cookies.length), 空间复杂度 O(1)