贪心算法


贪心算法

基本定义

  • 顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的

常见问题及求解

1.分配问题

  • 题目:有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小,每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱,求解,最多有多少孩子可以吃饱?

  • 输入输出案例

    输入:1  2//代表有两个孩子,饥饿度分别为1和2
          1  2  3//有三个饼干,饼干大小分别为1 2 3
    输出:2//有两个孩子能吃饱
    
  • 题解

    因为饥饿度最小的孩子最容易吃饱,所以我们先考虑这个孩子,为了尽量使得剩下的饼干可以满足饥饿度更大的孩子,所以我们应该把大于等于这个孩子饥饿度的、且大于最小的饼干给这个孩子。满足了这个孩子之后,我们采用同样的策略,考虑剩下孩子里饥饿度最小的孩子,直到没有满足条件的饼干存在。

    简而言之,这里的贪心策略是给剩余孩子里最小饥饿度的孩子分配最小的,能饱腹的饼干,至于具体实现,因为我们需要获得大小关系,一个便携的方法,就是把孩子和饼干分别排序,这样我们就可以从饥饿度最小的孩子和大小最小的饼干出发,计算有多少个孩子可以满足条件。

  • 代码解析

    package 贪心算法;
    
    import java.util.Arrays;
    
    public class Demo01 {
        static int solution(int[]children,int[]cookies){
            Arrays.sort(children);
            Arrays.sort(cookies);
            int child=0;//能吃饱孩子的个数
            int cookie=0;
            while(child

2.买卖股票的最佳时机问题

  • 题目:给定一个数组,他的第i个元素是一支给定股票的第i天的价格

    ? 设计一个算法来计算你所能获取的最大利润,你可以尽可能的完成更多的交易,注意你不能同时参与多笔交易。

  • 输入输出案例

    输入:[7,1,5,3,6,4]
    输出:7
    解释:在第二天(股票价格为1)的时候买入,在第三天(股票价格为5)的时候卖出这笔交易所能获得利润为4
    随后在第四天(股票价格为3)的时候买入,在第五天(股票价格为6)的时候卖出这笔交易所能获得的利润为3
    
  • 代码解析

    package 贪心算法;
    
    import java.util.Arrays;
    
    public class Demo01 {
        static int solution(int[]prices){
            int profit=0;
            for (int i = 0; i < prices.length-1; i++) {
                if (prices[i]