贪心算法理解+leetcode例题(Java)

贪心算法

算法解释

  • 贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
  • 于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
  • 举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹 果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的 贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的又因为全局结果是局部结果的简单求和,且局部结果互不相干,因此局部最优的策略也同样是全局最优的策略。

分配问题

455. 分发饼干
  • 题解

    • 为了尽可能满足最多数量的孩子,从贪心的角度考虑,应该按照孩子的胃口从小到大的顺序依次满足每个孩子且对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干

    • 简而言之,这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。

      //排序加贪心
      //因为两个数组都排序了,当前最小饥饿度的孩子不能满足,后面的孩子都不能满足,第二个数组的索引处的元素表示第几小的饼干
      public int findContentChildren(int[] g, int[] s) {
             
              int child = 0;
              int cookie = 0;
              Arrays.sort(g);
              Arrays.sort(s);
          //child:记录索引和记录满足的孩子个数
          //cookie:记录索引
              while(child<g.length&&cookie<s.length){
             
                   //对于每一个小孩,找到满足胃口的最小饼干
                  if(g[child]<=s[cookie]) {
             
                      child++;
                  }
                  cookie++;
              }
              return child;
          }
      
135. 分发糖果
  • 定制规则:学生A和学生B左右相邻,A在B左边

    • 左规则:当 ratingsB>ratingsA时,B的糖比 A 的糖数量多。即学生B对左边的学生A要满足左规则
    • 右规则: 当 ratings_A>ratings_B时,A的糖比B的糖数量多。即学生A对右边的学生B要满足右规则
  • 相邻的学生中,评分高的学生必须获得更多的糖果 等价于 所有学生满足左规则且满足右规则

  • 这里的贪心策略就是,在每次遍历中,只考虑并更新相邻一 侧的大小关系。

  public int candy(int[] ratings) {
   
        int count = 0;
        int[] grades = new int[ratings.length];
        for(int i =0;i<grades.length;i++){
   
            grades[i]=1;
        }
        //确保每个学生满足左规则
        for(
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值