柠檬水找零
题目链接:860. 柠檬水找零 - 力扣(LeetCode)
思路:注意对于20元的情况,有两种找零方式,
头一次见到这种情况,随便加一个标准输出才能通过的样例。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int l[2];
for(int i=0;i<bills.size();i++){
if(bills[i]==5){
l[0]+=1;
}
else if(bills[i]==10){
if(--l[0]<0)return false;
l[1]+=1;
}
else{
if(--l[0]<0){return false;}
cout<<"";
if(--l[1]<0){
++l[1];
if(l[0]<2)return false;
else l[0]-=2;
}
}
}
return true;
}
};
根据身高重建队列
题目链接:406. 根据身高重建队列 - 力扣(LeetCode)
思路:本题和分糖果有点类似,也是先处理一边再处理另一边。先从高到低按身高排序,接下来向队列里按顺序插入。注意高个子看不到低个子,低个子是比高个子更晚进入队列,因此不影响高个子。
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(),
[](const vector<int>& u, const vector<int>& v) {
return u[0] > v[0] || (u[0] == v[0] && u[1] < v[1]);
});
vector<vector<int>> ans;
for (const vector<int>& person : people) {
ans.insert(ans.begin() + person[1], person);
}
return ans;
}
};
用最少数量的箭引爆气球
题目链接:452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
思路:重叠区间问题,首先用上一题学到的排序对区间进行从左到右排序,接下来不断更新重叠区间的起点和终点,每当遍历一个区间,都要更新起点,看情况是否更新终点。如果下一个区间的起点已经超出重叠区间的终点,则直接加一根箭,同时重新开始计算重叠区间。本质是排序加贪心。
注意:排序算法里要传递引用,否则会超时。
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),[](const vector<int>&u,const vector<int>&v){
return u[0]<v[0]||(u[0]==v[0]&&u[1]<v[1]);
});
int start=points[0][0];
int end=points[0][1];
int count=0;
for(int i=0;i<points.size();i++){
if(points[i][0]<=end){
start=points[i][0];
if(end>=points[i][1])
end=points[i][1];
continue;
}
++count;
start=points[i][0];
end=points[i][1];
}
return count+1;
}
};
这里放一种相同思路,但写法更优秀:
class Solution {
private:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
if (points.size() == 0) return 0;
sort(points.begin(), points.end(), cmp);
int result = 1; // points 不为空至少需要一支箭
for (int i = 1; i < points.size(); i++) {
if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>=
result++; // 需要一支箭
}
else { // 气球i和气球i-1挨着
points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界
}
}
return result;
}
};
作者:代码随想录
链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/solutions/858320/dai-ma-sui-xiang-lu-dai-ni-xue-tou-tan-x-5wfl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
标签:return,int,随想录,第三十四,找零,vector,const,气球,points From: https://www.cnblogs.com/Liubox/p/18048823