860.柠檬水找零
解析:代码随想录
题目:- LeetCode
关键点在于量化5,10的硬币数量,剩下根据规则写就行。
class Solution {
public boolean lemonadeChange(int[] bills) {
int f = 0;
int t = 0;
for (int pay : bills) {
if (pay == 5) {
f += 1;
} else if (pay == 10){
f -= 1;
t += 1;
} else {
f -= 1;
if (t <= 0) f -= 2;
else t -= 1;
}
if (f < 0 || t < 0) return false;
}
return true;
}
}
406.根据身高重建队列
解析:代码随想录
题目:- LeetCode
整个就是一个不会,照着解析写一遍。
1. 身高从大到小排(身高相同k小的站前面)
2. 运用linkedlist add(int index, int element)的特性,当index有值整体向右移动。根据sorted people给新的2darray 赋值
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][]);
}
}
最后转化
note:
sort格式:
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1];
return b[0] - a[0];
});
转化格式:que.toArray(new int[people.length][]);
452. 用最少数量的箭引爆气球
解析:代码随想录
题目:- LeetCode
自己写的时候int overflow了,因为用的a[0] - b[0], 应该用 Integer.compare(a[0], b[0])),而且写完才发现,start没有用,只需要记录end。
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int count = 1;
int start = points[0][0];
int end = points[0][1];
for (int[] ballon : points) {
if (ballon[0] > end) {
count++;
start = ballon[0];
end = ballon[1];
} else {
start = Math.max(ballon[0], start);
end = Math.min(ballon[1], end);
}
}
return count;
}
}
逻辑一样,解析的方法更巧妙省去了end直接更改上一个ballon的值
解析写法:
class Solution {
public int findMinArrowShots(int[][] points) {
// 根据气球直径的开始坐标从小到大排序
// 使用Integer内置比较方法,不会溢出
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int count = 1; // points 不为空至少需要一支箭
for (int i = 1; i < points.length; i++) {
if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>=
count++; // 需要一支箭
} else { // 气球i和气球i-1挨着
points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界
}
}
return count;
}
}