860.柠檬水找零
完成
思路:
本题思路简单,是一道模拟题。贪心的策略在于:5元纸币可以给10元和20元找零,10元纸币只能给20元找零,因此在找零时优先使用10元纸币,而不是三张5元纸币。
代码
class Solution {
public boolean lemonadeChange(int[] bills) {
int num_5 = 0;
int num_10 = 0;
for (int i = 0; i < bills.length; i++) {
switch (bills[i]) {
case 5:
num_5++;
break;
case 10:
num_10++;
num_5--;
break;
case 20:
if (num_10>0) {
num_10--;
num_5--;
}else{
num_5-=3;
}
break;
default:
break;
}
if(num_5<0||num_10<0) return false;
}
return true;
}
}
406.根据身高重建队列
完成
思路:
本题也有两个维度需要考虑,h和k,要先确定一个,再考虑另一个。
应该先确定h,按身高从大到小排序。这样身高这一维度就有序了,身高相同时,按k从小到大排序。这样对于每个元组,其前面的元素都是身高大于等于本身的元素。和k值比较,重新排列即可。
代码
class Solution {
public int[][] reconstructQueue(int[][] people) {
// 按身高从大到小排,身高相同时按k从小到大排
Arrays.sort(people,(a,b)->a[0]==b[0]?a[1]-b[1]:b[0]-a[0]);
List<int[]> res = new LinkedList<>();
// 根据k值重新插入
for(int[] person:people){
res.add(person[1], person);
}
return res.toArray(new int[people.length][]);
}
}
452. 用最少数量的箭引爆气球
完成
思路:
本题贪心的策略是,尽可能射更多的重叠区间。
代码
class Solution {
public int findMinArrowShots(int[][] points) {
// 这里(a, b)->a[0]-b[0]有溢出问题。
Arrays.sort(points,(a,b)->Integer.compare(a[0], b[0]));
int res = 1;
for (int i = 1; i < points.length; i++) {
// 不重叠
if(points[i][0]>points[i-1][1]) res++;
// 重叠,需要更新最小右边界
else points[i][1] = Math.min(points[i][1], points[i-1][1]);
}
return res;
}
}