在柠檬水摊上,每一杯柠檬水的售价为?5
?美元。顾客排队购买你的产品,(按账单?bills
?支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付?5
?美元、10
?美元或?20
?美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付?5
?美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组?bills
?,其中?bills[i]
?是第?i
?位顾客付的账。如果你能给每位顾客正确找零,返回?true
?,否则返回?false
?。
- 如果顾客支付 5 美元,不需要找零。
- 如果顾客支付 10 美元,需要一张 5 美元纸币来找零。
- 如果顾客支付 20 美元,优先使用一张 10 美元和一张 5 美元纸币来找零。如果没有 10 美元纸币,可以使用三张 5 美元纸币。
/*
* @lc app=leetcode.cn id=860 lang=cpp
*
* [860] 柠檬水找零
*/
// @lc code=start
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0;
for (int bill : bills) {
if (bill == 5) {
five++;
} else if (bill == 10) {
if (five == 0) return false;
five--;
ten++;
} else {
if (five > 0 && ten > 0) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
};
// @lc code=end
假设有打乱顺序的一群人站成一个队列,数组?people
?表示队列中一些人的属性(不一定按顺序)。每个?people[i] = [hi, ki]
?表示第?i
?个人的身高为?hi
?,前面?正好?有?ki
?个身高大于或等于?hi
?的人。
请你重新构造并返回输入数组?people
?所表示的队列。返回的队列应该格式化为数组?queue
?,其中?queue[j] = [hj, kj]
?是队列中第?j
?个人的属性(queue[0]
?是排在队列前面的人)。
基本思路是先将人们按照身高从高到低排序,对于身高相同的人,则按照前面比他们高的人数(ki值)从小到大排序。然后,依次将这些人插入到结果队列中的指定位置。
/*
* @lc app=leetcode.cn id=406 lang=cpp
*
* [406] 根据身高重建队列
*/
// @lc code=start
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]);
});
vector<vector<int>> result;
for (auto& person : people) {
result.insert(result.begin() + person[1], person);
}
return result;
}
};
// @lc code=end
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组?points
?,其中points[i] = [xstart, xend]
?表示水平直径在?xstart
?和?xend
之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点?完全垂直?地射出。在坐标?x
?处射出一支箭,若有一个气球的直径的开始和结束坐标为?x
start
,x
end
,?且满足 ?xstart?≤ x ≤ x
end
,则该气球会被?引爆?。可以射出的弓箭的数量?没有限制?。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组?points
?,返回引爆所有气球所必须射出的?最小?弓箭数?。
基本思路是找出气球的重叠部分,并在这些重叠部分中射箭。如果一个箭可以击中多个气球,那么就不需要再射另外的箭来击中这些气球了。目标是最小化射出的箭的数量。
/*
* @lc app=leetcode.cn id=452 lang=cpp
*
* [452] 用最少数量的箭引爆气球
*/
// @lc code=start
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
if (points.empty()) {
return 0;
}
sort(points.begin(), points.end(), [](const vector<int>& a, const vector<int>& b){
return a[1] < b[1];
});
int arrows = 1;
int end = points[0][1];
for (const auto& point : points) {
if (point[0] > end) {
arrows++;
end = point[1];
}
}
return arrows;
}
};
// @lc code=end