LeetCode 860 柠檬水找零
题目链接:860.柠檬水找零
思路: 零钱总共有5、10、20三种。所以分别对收取的5元和10元进行计数。由于柠檬水单价为5元,当顾客付5元时,不需要进行判断。当顾客付10元时,此时至少有一张5元。然后5元的数量减1,10元的数量加1。当顾客付20元时,如果存在10元优先将10元拿出(保留最小的单位,后面如果存在10元的付款可以用5元找零),此处存在三种情况,第一种10元的数量>=1,5元的数量>=1;第二种没有10元,5元的数量>=3;第三种情况无法找零。
代码:
class Solution {
public boolean lemonadeChange(int[] bills) {
int countFive = 0;
int countTen = 0;
for (int i = 0; i < bills.length; i++){
if (bills[i] == 5){
countFive++;
}
if (bills[i] == 10){
if (countFive < 1){
return false;
}
countFive--;
countTen++;
}
if (bills[i] == 20){
if (countFive > 0 && countTen > 0){
countTen--;
countFive--;
}else if (countFive >= 3){
countFive -= 3;
}else{
return false;
}
}
}
return true;
}
}
LeetCode 406.根据身高重建队列
题目链接:406.根据身高重建队列
思路: 首先针对二维数组,第0列表示人的身高,第1列表示该人前面存在几人。首先根据人的身高从高到低进行排序,然后按照身高的顺序从高到低,根据k值将人插入到对应的位置。
代码:
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][]);
}
}
LeetCode 452.用最少数量的箭引爆气球
题目链接:452.用最少数量的箭引爆气球
思路: 首先根据气球直径开始的位置对气球进行排序。如果第i个气球开始的位置(左侧值)大于第i-1个气球结束的位置,则两个气球没有重合,此时就需要多一支弓箭;如果两个气球有重合,则取两个气球中右侧最小的值作为新的边界。
代码:
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;
}
}