代码随想录刷题随记30-贪心4
860.柠檬水找零
leetcode链接
比较显然
class Solution {
public boolean lemonadeChange(int[] bills) {
int []account=new int[3];
for(int cur:bills){
if(cur==5)
account[0]++;
else if(cur==10){
account[0]--;
if(account[0]<0)
return false;
account[1]++;
}
else{
//stratege1
account[1]--;
account[0]--;
if(account[0]>=0&&account[1]>=0)
continue;
//stratege2
account[1]++;
account[0]-=2;
if(account[0]<0)
return false;
}
}
return true;
}
}
406.根据身高重建队列
leetcode链接
首先按照身高h来排序,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
按照k为下标重新插入队列。
之所以要先按照身高从大到小进行排序,是因为这时当按照k把身高低的人从前面往队内插入的时候,不会影响高的人的k值。我们的目的实际上是要保证第二次插入时,因为插入导致顺序变化后的结果不会影响已经完成插入的元素的结果
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,(a,b)->{if(a[0]==b[0]) return a[1]-b[1];else return b[0]-a[0];});
LinkedList<int[]>que=new LinkedList<>();
for(int[] person:people){
que.add(person[1],person);
}
return que.toArray(new int[people.length][]);
}
}
452. 用最少数量的箭引爆气球
leetcode链接
class Solution {
public int findMinArrowShots(int[][] points) {
Arrays.sort(points,(a,b)->{return Integer.compare(a[0] ,b[0]);});//这里不能写成a[0]-b[0]不然存在溢出的问题
int count=1;
for(int i=1;i<points.length;i++){
if(points[i-1][1]<points[i][0]){
count++;
}
else{
points[i][1]=Math.min(points[i-1][1], points[i][1]);//这个更新很巧妙
}
}
return count;
}
}