860.柠檬水找零
这是一个模拟题,但也有贪心思想:5块更通用,所以20的时候优先用10块。
三种情况:
- 5块:直接fiveCount++;
- 10块:先看5块够不够,够的话5块--10块++;
- 20块:先看10块够不够,够的话再看5块够不够;
- 不够看有没有三个5块。
class Solution {
public boolean lemonadeChange(int[] bills) {
int fiveCount = 0;
int tenCount = 0;
for (int bill : bills) {
if(bill == 5){
fiveCount++;
}else if(bill == 10){
if(fiveCount <= 0){
return false;
}
fiveCount--;
tenCount++;
}else if(bill == 20){
if(tenCount > 0){
if(fiveCount <= 0){
return false;
}
tenCount--;
fiveCount--;
}else{
if(fiveCount <= 2){
return false;
}
fiveCount--;
fiveCount--;
fiveCount--;
}
}
}
return true;
}
}
406. 根据身高重建队列
先根据身高将序排序,相同身高的按照a[1]升序
class Solution {
public int[][] reconstructQueue(int[][] people) {
// 身高从大到小排(身高相同k小的站前面)
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1]; // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列
return b[0] - a[0]; //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列
});
LinkedList<int[]> que = new LinkedList<>();
for (int[] p : people) {
que.add(p[1],p); //Linkedlist.add(index, value),會將value插入到指定index裡。
}
return que.toArray(new int[people.length][2]);
}
}
- 使用Arrays.sort配合lambda表达式,->左边是变量, 大括号里写判断函数
- 用LinkedList因为要频繁插入元素,效率高
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性
452. 用最小数量的箭引爆气球
表面上看是打气球, 实际上是一个重叠子区间问题,用多少🗡️就是求有多少个不重叠的子区间(因为重叠的部分都可以被一只🗡️打到)
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, Comparator.comparingInt(a -> a[1]));
int count = 1;
int x_end = points[0][1];
for(int[] point : points){
if(point[0] > x_end){//这里的等于号去掉
count++;
x_end = point[1];
}
}
return count;
}
}
- 又出现了Arrays.sort!!!