860
题目:
在柠檬水摊上,每一杯柠檬水的售价为 5
美元。顾客排队购买你的产品,(按账单 bills
支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5
美元、10
美元或 20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5
美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills
,其中 bills[i]
是第 i
位顾客付的账。如果你能给每位顾客正确找零,返回 true
,否则返回 false
。
题目链接:860. 柠檬水找零 - 力扣(LeetCode)
思路:
简单,先尽量找零10美元,如果不够再5美元。
代码:
java
class Solution {
public boolean lemonadeChange(int[] bills) {
int count_5 =0;
int count_10=0;
int count_20=0;
for(int i=0;i<bills.length;i++)
{
if(bills[i]==5) count_5++;
else if(bills[i]==10)
{
if(count_5==0) return false;
else{
count_5--;
count_10++;
}
}
else{
if(count_5==0) return false;
else{
if(count_10==0 && (count_5==1 ||count_5==2)) return false;
else if(count_10>=1){
count_10--;
count_5--;
count_20++;
}
else if(count_10==0 && count_5>=3)
{
count_5=count_5-3;
count_20++;
}
}
}
}
return true;
}
}
406
题目:
假设有打乱顺序的一群人站成一个队列,数组 people
表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki]
表示第 i
个人的身高为 hi
,前面 正好 有 ki
个身高大于或等于 hi
的人。
请你重新构造并返回输入数组 people
所表示的队列。返回的队列应该格式化为数组 queue
,其中 queue[j] = [hj, kj]
是队列中第 j
个人的属性(queue[0]
是排在队列前面的人)。
题目链接:406. 根据身高重建队列 - 力扣(LeetCode)
思路:
类似于分发糖果想法,先对身高降序排序,如果身高相同则人数升序排,按这样排序再将其插入k位置的LinkeList中。
代码:
java
class Solution {
public int[][] reconstructQueue(int[][] people) {
// 身高从大到小排(身高相同k小的站前面)
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0])
return a[1] - b[1]; // a - b 是升序排列,故在a[0] == b[0]的状況下,会根据k值升序排列
return b[0] - a[0]; // b - a 是降序排列,在a[0] != b[0],的状況会根据h值降序排列
});
LinkedList<int[]> que = new LinkedList<>();
for (int[] p : people) {
que.add(p[1], p); // Linkedlist.add(index, value),会将value插入到指定index里。
}
return que.toArray(new int[people.length][]);
}
}
代码随想录中的代码。
452
题目:
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points
,其中points[i] = [xstart, xend]
表示水平直径在 xstart
和 xend
之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x
处射出一支箭,若有一个气球的直径的开始和结束坐标为 x``start
,x``end
, 且满足 xstart ≤ x ≤ x``end
,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points
,返回引爆所有气球所必须射出的 最小 弓箭数。
题目链接:452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
思路:
根据气球起始进行升序排序,判断前一个的end是否小于后一个的start则需要多一个箭,否则保存其为后一个的end为两者end的最小值。
代码:
java
class Solution {
public int findMinArrowShots(int[][] points) {
// 根据气球直径的开始坐标从小到大排序
// 使用Integer内置比较方法,不会溢出
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], points[i - 1][1]); // 更新重叠气球最小右边界
}
}
return count;
}
}
随想录代码