860.柠檬水找零
思路:
10块找5块,20找15(有找1张10块、2张5块和找3张5块的方法,优先使用第一种),每次收钱记录自己10块和5块的张数,并使用上述找钱的方法,如果5块和10块的张数为负,说明不行。
代码:
class Solution {
public boolean lemonadeChange(int[] bills) {
int[] billrest = new int[2];
for(int i = 0; i < bills.length; i++){
if(bills[i] == 5){
billrest[0]++;
}else if(bills[i] == 10){
billrest[0]--;
billrest[1]++;
}else if(bills[i] == 20){
if(billrest[1] > 0){
billrest[1]--;
billrest[0]--;
}else{
billrest[0]-=3;
}
}
if(billrest[0] < 0 || billrest[1] < 0) return false;
}
return true;
}
}
需要注意的点:
406.根据身高重建队列
思路:
两个属性,先按照身高从大到小排序,这也是重组数组的顺序,如果身高一样,K小的排在前面,最后用链表将排序后的数组放在k位置,再转成数组。
代码:
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,(a,b) -> {
/*
身高按照从大到小排,保证前面的人都比自己高,
k就是自己往前插队后的位置
身高相同就将k小的排在前
这样保证k相对大的放在后面排序得到正确顺序
*/
if(a[0] == b[0]) return a[1] - b[1];
return b[0] - a[0];
});
LinkedList<int[]> que = new LinkedList<>();
for(int[] p : people){
//将p放在p【1】位置
que.add(p[1],p);
}
return que.toArray(new int[people.length][]);
}
}
需要注意的点:
1、排序的写法
2、链表方便增删,用链表来插入需要排序的人。
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;
}
}
需要注意的点:
1、射过的气球组直接跳过就行,箭用count记录。
2、正在遍历的气球能加入到上一个气球组时,要取两个右边界的最小值,这样能保证能在尽量靠右(扩大范围)的前提下射到新加入的气球。