代码随想录
860.柠檬水找零
思路
思路:用一个变量记录当前纸币5的数量以及10的数量,在找零20的时候,优先选择5和10 的组合,因为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) {
five--;
ten++;
} else if (bills[i] == 20) {
if (ten > 0) {
ten--;
five--;
} else {
five -= 3;
}
}
if (five < 0 || ten < 0) return false;
}
return true;
}
}
406.根据身高重建队列
思路
思路:找到身高最矮的人,然后找到他前面有多少人是等于或高于他,就可以确定他在第几个位置。
题解思路:有两个维度,h和k 需要先确定一个维度,再按照另一个维度重新排列。
因为k统计的是 前面大于等于他的数量,所以需要按照h从大到小排, 如果相等再按照k从小到大排。
按照k来插入节点,后续插入的节点也不会影响前面已经插入的节点。
linkedlist有一个方法是按照索引插入 add(索引,元素)
以及toArray方法
代码
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];
});
List<int[]> l = new LinkedList<>();
for(int[] p : people){
l.add(p[1],p);
}
return l.toArray(new int[people.length][]);
}
}
452. 用最少数量的箭引爆气球
思路
题解思路:先按照x坐标的最左边位置排序, 当前一个的最右坐标大于后一个的最左坐标,表示此时需要多一个箭。
并且需要每次缩小一下重叠的最小右边界
代码
class Solution {
public int findMinArrowShots(int[][] points) {
int count = 1;
Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));
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;
}
}