Leetcode 刷题 贪心算法

860. 柠檬水找零

美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。 

 

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;

        for(int i = 0; i < bills.length; i++){
            if(bills[i] == 5){
                five++;
            }else if(bills[i] == 10){
                ten++;
                five--;
            }else{
                if(ten >0){
                    ten--;
                    five--;
                }else{
                    five -= 3;
                }
            }
            if(ten < 0 || five < 0){
                return false;
            }
        }
        return true;
    }
}

406. 根据身高重建队列

遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度

如果两个维度一起考虑一定会顾此失彼。        

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

全局最优:最后都做完插入操作,整个队列满足题目队列属性

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, (a, b)->{
            if(a[0] == b[0]){
                return a[1] - b[1];
            }
            return b[0] - a[0];
        });

        LinkedList<int[]> que = new LinkedList();

        for(int[] p : people){
            que.add(p[1], p);
        }

        return que.toArray(new int[people.length][2]);
    }
}

 这题对于Arrays.sort() 的使用不是特别会

先按照第一个维度逆序排序 如果第一个维度相同 那就按照第二个维度进行排序

其次 LinkedList 的add方法

add(int index, Eelement)
//Linkedlist.add(index, value),會將value插入到指定index裡。

toArray()

list.toArray()方法不接收参数时, 返回一个Object数组
toArray(T[] a)方法接收T类型的数组, 返回一个T类型的数组

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

 局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。

为了让气球尽可能的重叠,需要对数组进行排序

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b)->{
            return Integer.compare(a[0], b[0]);
        });

        int res = 1;
        int end = points[0][1];

       for(int i = 1; i < points.length; i++){
           if(points[i][0] > points[i-1][1]){
               res++;
           }else{
               points[i][1] = Math.min(points[i][1], points[i-1][1]);
           }
       }
       return res;
    }
}

回顾

Integer.compare();

java.lang包的Integer类的compare()方法比较作为参数给出的两个整数值(x,y),
if(x == y) 则返回零
if (x < y)  则返回小于零
if (x > y),则返回大于零的值。


Integer.compareTo()
Java中Integer.compareto方法,用于在数值上比较两个Integer对象,2个必须都是Integer对象才能进行对比。
public class IntegerCompareToDemo {  
    public static void main(String args[]) {  
        Integer b = 5;
        Integer c = 15;
	System.out.println(b.compareTo(c)); //输出-1
	b = 15;
	System.out.println(b.compareTo(c)); //输出0
	b = 20;
	System.out.println(b.compareTo(c)); //输出1
    }  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值