Day 32 算法记录|贪心算法

Leecode

860. 柠檬水找零

代码随想录解析

维护三种金额的数量,5,10和20。
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5
情况三这里是有贪心的
所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零

class Solution {
    public boolean lemonadeChange(int[] bill) {
    int five =0; 
    int ten =0;
   for(int i=0;i<bill.length;i++){
       //情况1
       if(bill[i]==5){
           five++;
       }else if(bill[i] == 10){
           five--;
           ten++;
       }else if(bill[i] == 20){
          if(ten >0){
              ten--;
              five--;
          }else{
              five -=3;
          }
       }
  if(five<0||ten<0) return false;
   }
  
   return true;

    }
}

406. 根据身高重建队列

所以在按照身高从大到小排序后:

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性
在这里插入图片描述排序规则:
首先按照身高降序排列,若身高相同,比第二个属性,升序排列

class Solution {
    public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people,(o1,o2)->o1[0] == o2[0]?o1[1]-o2[1]:o2[0]-o1[0]); //1-2升序,2-1降序

    List<int[]> list = new ArrayList<>();
    for(int[] p: people){
        list.add(p[1],p);
    }

    return list.toArray(new int[list.size()][2]);
    }
}

452. 用最少数量的箭引爆气球

局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。
讲解的很清楚:
先按照末尾升序,如果前一个的尾部小于后一个头部,则需要新的

class Solution {
    public int findMinArrowShots(int[][] points) {

    Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));
   // Arrays.sort(points,(O1,O2)->O1[0]-O2[0]);

    int count =1;
    int axis = points[0][1];
    for(int i =1;i<points.length;i++){
        if(axis<points[i][0]){
            count++;
            axis = points[i][1];
        }
    }
    return count;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值