class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int FiveSum = 0;
int TenSum = 0;
for(int i = 0; i < bills.size(); i++) {
if(bills[i] == 5) {
FiveSum++;
}
if(bills[i] == 10 ) {
if(FiveSum > 0 ) {
FiveSum--;
TenSum++;
}
else{
return false;
}
}
if(bills[i] == 20) {
if (FiveSum > 0 && TenSum > 0) {
FiveSum--;
TenSum--;
}
else if (FiveSum >= 3 && TenSum <= 0) {
FiveSum = FiveSum - 3;
}
else {
return false;
}
}
}
return true;
}
};
【一开始没读懂题】这是一个关于重新构造队列的问题,需要根据给定的人员属性重新排列队列。
题目中给出了一个数组 people,其中每个元素表示队列中的一个人的属性,包括身高 hi 和前面大于或等于他身高的人数 ki。数组中的元素不一定按照队列中的顺序排列。
简单来说,people 数组是乱序的,让大家根据 people[i] 的 hi 和 ki 对 people 进行重排序,让重排序后的 people[i] 所在的位置符合 ki 描述的“前面有几个人比他高”这个条件。
本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
if(a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(),cmp);
vector<vector<int>> que;
for(int i = 0; i < people.size(); i++) {
int position = people[i][1];
que.insert(que.begin() + position, people[i]);
}
return que;
}
};
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
// int result = 0;
// int cover = 0;
// sort(points.begin(), points.end(), cmp);
// for (int i = 0; i < points.size(); i++) {
// cover = max(points[i][1] + i, cover); // 找到覆盖范围
// if(points[i][1] <= cover) {
// continue;
// }
// else {
// result++;
// }
// }
// return result;
if(points.size() == 0) return 0;
sort(points.begin(), points.end(), cmp);
int result = 1;
for (int i = 1; i < points.size(); i++) {
if(points[i][0] > points[i-1][1]) {
result++;
}
else {
points[i][1] = min(points[i-1][1], points[i][1]);
}
}
return result;
}
};