数据结构与算法学习——贪心算法

贪心算法

    • 贪心算法简介
    • 数组中对单个元素的贪心算法
      • 455.分发饼干(Easy)
    • 数组中对多个元素贪心的算法
      • 122. 买卖股票的最佳时机 II(Medium)

贪心算法简介

贪心算法总的来看是希望能够通过局部最优解来获取全局最优解的一种方法,在求解最值问题时可以考虑使用贪心算法。
贪心算法在使用时,主要需要以下两个条件:

  • 局部最优解是可以求得的
  • 从局部最优解可以 推出全局最优解

贪心算法的局部最优解推出整体最优解是一个比较复杂的过程,通常可以通过举反例的方式来判断是否可以使用贪心算法。例如在背包问题中,对于一个承重有限的背包,我们每次拿重量最大的物品无法推出最后的总重量最大,对于一个10的背包,4,5,8为物品重量,如果只拿8是没有拿4和5更优的,因此此时不适用贪心。

数组中对单个元素的贪心算法

在贪心算法中,往往会利用到数组来构建局部的贪心算法,从而达到总体的贪心算法 ,这类的题型往往是对于数组中的单个元素进行贪心算法,对每一个元素进行操作,决定这个元素是否可以应用我们的操作。

455.分发饼干(Easy)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例:
输入: g = [1,2], s = [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

求解思路:
分发饼干时,考虑对于局部的最优,胃口最小的孩子应该尽可能拿最小的饼干,对于全局最优,最多的孩子拿到了饼干,无法举出反例,尝试贪心算法。因此局部最优的条件是,胃口最小的孩子获得满足胃口同时最小的饼干,依此为条件,对饼干数组遍历即可。这是对于饼干数组的每一个元素,考虑是否有胃口最小的小孩能够对应上,如果能够对应上,说明这个饼干元素被分配,因此计数增加。为节省空间,分配到饼干的小孩数实际上就等于分配出去的饼干数,因此最终返回i。

class Solution {
   
    public int findContentChildren

你可能感兴趣的:(数据结构,java)