代码随想录第三十五天|Leetcode860.柠檬水找零、Leetcode406.根据身高重建队列、Leetcode452. 用最少数量的箭引爆气球
Leetcode860.柠檬水找零
写满了if,else的屎山,虽然是时间On,空间O1吧,但这ifelse我自己都觉得恶心
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
vector<int> dollars(2,0);
for(int i=0;i<bills.size();i++){
if(bills[i]==5) dollars[0]++;//给了个5
else if(bills[i]==10){
//给了个10
dollars[0]--;
if(dollars[0]<0) return false;
dollars[1]++;
}
else{
//给了个20
if(dollars[1]>0){
//有10块的
dollars[1]--;
dollars[0]--;
if(dollars[0]<0||dollars[1]<0) return false;
}
else{
//只有五块的
dollars[0]-=3;
if(dollars[0]<0) return false;
}
}
}
return true;
}
};
看了一眼答案,原来就是使用这个屎山,没事了
Leetcode406.根据身高重建队列
这个方法挺不错的,还可以改进一下用list,这样insert就变成O1级别了,vector的insert要On
class Solution {
public:
// 身高从大到小排(身高相同k小的站前面)
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);
list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
for (int i = 0; i < people.size(); i++) {
int position = people[i][1]; // 插入到下标为position的位置
list<vector<int>>::iterator it = que.begin();
while (position--) {
// 寻找在插入位置
it++;
}
que.insert(it, people[i]);
}
return vector<vector<int>>(que.begin(), que.end());
}
};
Leetcode452. 用最少数量的箭引爆气球
初期的想法想用贪心,让每支箭都射爆尽可能最多的气球,以换取最后使用箭数量最少。
那么就先排序,然后维护一个end,更新当前交集的尾巴,排序之后一下就有思路了。但是执行时间很长,不知道为啥
class Solution {
private:
static bool cmp(vector<int>&a,vector<int>&b){
if(a[0]==b[0]) return a[1]<b[1];
return a[0]<b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),cmp);
int end=points[0][1];
int result=1;
for(int cur=1;cur<points.size();cur++){
if(points[cur][0]>end){
end=points[cur][1];
result++;
}
end=min(end,points[cur][1]);
}
return result;
}
};