美元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;
}
}
遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度
如果两个维度一起考虑一定会顾此失彼。
局部最优:优先按身高高的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类型的数组
局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。
为了让气球尽可能的重叠,需要对数组进行排序。
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
}
}