1、leetcode860 柠檬水找零
class Solution {
public boolean lemonadeChange(int[] bills) {
if(bills[0] != 5) {
return false;
}
int five_nums = 0;
int ten_nums = 0;
for(int i=0; i<bills.length; i++) {
if(bills[i] == 5){
five_nums++;
}
if(bills[i] == 10) {
if(five_nums<1) {
return false;
}
ten_nums++;
five_nums--;
}
if(bills[i] == 20) {
// 优先消耗10美元,因为5美元的找零用处更大,能多留着就多留着
if(ten_nums>0 && five_nums>0) {
ten_nums--;
five_nums--;
} else if(five_nums>=3) {
five_nums -= 3;
} else {
return false;
}
}
}
return true;
}
}
2、leetcode406 根据身高重建队列
-
思路
-
按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。
-
所以在按照身高从大到小排序后:
-
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
-
全局最优:最后都做完插入操作,整个队列满足题目队列属性**
-
-
class Solution {
public int[][] reconstructQueue(int[][] people) {
// 身高从大到小排(身高相同k小的站前面)
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][]);
}
}
3、leetcode452 用最少数量的箭引爆气球
class Solution {
public int findMinArrowShots(int[][] points) {
// 根据气球直径的开始坐标从小到大排序
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][1], points[i][1]); // 更新重叠气球最小右边界
}
}
return count;
}
}
标签:return,nums,int,day34,people,points,气球
From: https://www.cnblogs.com/hzj-bolg/p/17135436.html