860. 柠檬水找零(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:遍历数组的过程中记录5块、10块的数量就好了,每次能用5块和10块进行找零的时候,尽量先用10块,因为5块用途更广,更应该多留点。
bool lemonadeChange(vector<int>& bills) {
int size = bills.size();
unordered_map<int, int> count;
for(int i=0; i<size; i++){
if(bills[i] == 5) count[5]++;
else if(bills[i] == 10){
if(count[5] > 0){
count[10]++;
count[5]--;
}else return false;
}
else if(bills[i] == 20){
if(count[5]>0 && count[10]>0){
count[20]++;
count[10]--;
count[5]--;
}else if(count[5]>2){
count[5] -= 3;
}else return false;
}
}
return true;
}
406. 根据身高重建队列(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:局部优先+整体优先。需要意识到的关键点是:矮个子的插入是不会影响高个子的。明白了这点就好做了,先将原数组按照身高进行排序(相同身高按照ki升序排序)。构建新数组时,从高个子开始插入,按照ki将其插入到新数组的指定位置。
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];
que.insert(que.begin()+position, people[i]);
}
return que;
}
1452. 用最少数量的箭引爆气球(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:一开始能想到做法,但是不知道怎么实现。其实很简单,只需将数组按照Xstart进行升序排序,然后每次比较points[i]的Xend和points[i+1]的Xstart是否重叠,重叠了的话意味着这两个气球可以一箭射穿,因此还需往后找看是否还有重叠的,因此需要将points[i]和points[i+1]的Xend中最小的那个赋值给points[i+1](数轴上最靠左边的),让points[i+1]继续和后面的进行比较。若不重叠则射箭次数+1,并从不重叠的气球重新开始计算。
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(), points.end(), cmp);
int result=1;
int size = points.size();
for(int i=1; i<size; i++){
if(points[i-1][1] < points[i][0]) result++;
else points[i][1] = min(points[i-1][1], points[i][1]);
}
return result;
}
本文解析了LeetCode中的三个问题:使用计数法解决柠檬水找零问题,利用局部优先和整体优先策略重构队列,以及优化箭矢射击气球以最小化次数。
799

被折叠的 条评论
为什么被折叠?



