题目:
860.柠檬水找零
406.根据身高重建队列
452. 用最少数量的箭引爆气球
学习内容:
860.柠檬水找零
这道题遍历bills,分成三种情况:
- 如果是5,直接收钱;
- 如果是10,找5,如果没有5,return false;
- 如果是20,优先找10元和5元,如果没有再找3个5元;(贪心)
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) {
if (five <= 0) return false;
five--;
ten++;
} else {
if (ten > 0 && five > 0) {
ten--;
five--;
} else if (five >= 3) {
five -= 3;
} else return false;
}
}
return true;
}
}
406.根据身高重建队列
首先,我们按照身高从高到矮排序,如果身高相同,则k小的排前面。其次,遍历排列好的队列,按照k调整排序,k是前面大于等于自己的,k直接作为索引插入即可。
局部最优:按照身高从高到矮排序,再按照k调整排序;
全局最优:每个元素都做出相应调整,整个队列满足要求。
class Solution {
public int[][] reconstructQueue(int[][] people) {
// 按照身高h从高到矮排序,如果身高相同,则k小的排前面
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<>();
// 按照k作为索引进行插入
for (int[] person : people) {
que.add(person[1], person);
}
return que.toArray(new int[people.length][]);
}
}
452. 用最少数量的箭引爆气球
这题比较难,贪心遇到多区间多元素的问题都可以考虑先排序。我们首先按照气球起始位置排序,其次遍历数组判断相邻气球是否重叠,如果不重叠则需要一支箭,如果重叠,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int count = 1;
for (int i = 1; i < points.length; i++) {
// 如果当前气球与左相邻没有重叠
if (points[i][0] > points[i - 1][1]) {
count++;
} else {
points[i][1] = Math.min(points[i][1], points[i - 1][1]);
}
}
return count;
}
}
学习时间:
2024.4.17