860.柠檬水找零
- 只需要记录5,10钞票的数量,
- 分为三种情况分别处理即可
- 客人给5块:直接收下5++;
- 客人给10块:
- 此时没五块钱,return false;
- 有五块,5–,10++;
- 客人给二十块,这时优先把十块钱花出去如果没有就给3张五块
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0;
for (int bill : bills) {
if (bill == 5) five++;
if (bill == 10) {
if (five <= 0) return false;
ten++;
five--;
}
if (bill == 20) {
if (five > 0 && ten > 0) {
ten--;
five--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
};
406.根据身高重建队列
-
和分发糖果有点像,需要过两边逻辑
-
首先将队列按照身高进行排序,
-
然后再按照第二位数字,前面比你高的人插入,这样保证了此时前面的人都比你高
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>> &people) {
list<vector<int>> res;
auto iter = res.begin();
sort(people.begin(), people.end(),
[](const vector<int> &p1, const vector<int> &p2) {
return p1[0] > p2[0] || (p1[0] == p2[0] && p1[1] < p2[1]);
});
for (int i = 0; i < people.size(); ++i) {
int position = people[i][1];
iter = res.begin();
while(position--){
iter++;
}
res.insert(iter, people[i]);
}
vector<vector<int>> res2(res.begin(), res.end());
return res2;
}
};
452.用最少数量的箭引爆气球
- 首先将所有范围按照最低点进行排序
- 如果后一个范围的下限超过上一个的上限,则需要的箭加一
- 如果没有超过,则更新上限,将目前的和前一个的上限进行比较,保留成更小的下限
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
if (points.size() == 0) return 0;
int res = 1;
sort(points.begin(), points.end(),
[](const vector<int>& p1, const vector<int>& p2) {
return p1[0] < p2[0];
});
for (int i = 1; i < points.size(); ++i) {
if (points[i][0] > points[i-1][1])
res++;
else
points[i][1] = min(points[i][1], points[i - 1][1]);
}
return res;
}
};
day35结束