什么是贪心算法
贪心算法是一种常用的算法思想,它是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致全局最优解的算法。
贪心算法通常分为两种类型:
- 基于贪心策略的优化问题:该类问题中,需要对某个目标函数进行最大化或最小化的优化,而目标函数通常可以分解为若干个子问题,且每个子问题的最优解可以直接得到,因此我们可以采取贪心策略,即在每个子问题中都选择当前最优解,最终得到全局最优解。
- 基于贪心思想的组合优化问题:该类问题中,需要从一个集合中选择一部分元素,使得这些元素满足某些条件,并且达到某个优化目标。在这种问题中,我们也可以采取贪心思想,即在每一步中都选择当前最优的元素,最终得到一个可行解或最优解。
贪心算法的优点是简单、高效,容易实现和调试。但是,贪心算法不能保证得到全局最优解,因此在某些情况下可能会得到次优解或不可行解。因此,在使用贪心算法时需要注意问题的特殊性和局限性,确保问题可以适用贪心算法。
- 题⽬目描述
有⼀一群孩⼦子和⼀一堆饼⼲干,每个孩⼦子有⼀一个饥饿度,每个饼⼲干都有⼀一个⼤大⼩小。每个孩⼦子只能吃最多⼀一个饼⼲干,且只有饼⼲干的⼤大⼩小⼤大于孩⼦子的饥饿
度时,这个孩⼦子才能吃饱。求解最多有多少孩⼦子可以吃饱。
例子
输⼊入两个数组,分别代表孩⼦子的饥饿度和饼⼲干的⼤大⼩小。输出最多有多少孩⼦子可以吃饱的数量量。
Input: [1,2], [1,2,3]
Output: 2
在这个样例例中,我们可以给两个孩⼦子喂[1,2]、[1,3]、[2,3]这三种组合的任意⼀一种。
- 思考 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)