1833. 雪糕的最大数量
分类:贪心;排序
一趟排序后贪心
class Solution {
public:
int maxIceCream(vector<int>& costs, int coins) {
sort(costs.begin(), costs.end());
int ret = 0;
for(int i=0; i<costs.size(); i++) {
if (coins >= costs[i]) {
coins-=costs[i];
ret++;
}
}
return ret;
}
};
桶排序
class Solution {
public:
const static int maxSize = 1e5 + 1;
int freq[maxSize];
int maxIceCream(vector<int>& costs, int coins) {
for(int i=0; i<costs.size(); i++){
freq[costs[i]] ++;
}
int ret = 0, i = 0;
while(i<maxSize && coins>0){
if(freq[i] > 0) {
coins -= i;
freq[i]--;
ret++;
} else {
i++;
}
}
return coins < 0 ? ret-1 : ret;
}
};
小顶堆,全部入队后,依次出队
class Solution {
public:
priority_queue<int, vector<int>, greater<int> > q;
int maxIceCream(vector<int>& costs, int coins) {
for(int i=0; i<costs.size(); i++){
q.push(costs[i]);
}
int ret = 0;
while(!q.empty() && coins > 0) {
int t = q.top(); q.pop();
coins -= t;
ret++;
}
return coins < 0 ? ret - 1 : ret;
}
};
大顶堆。遇到一个就放入,如果超过了,则取出堆顶
class Solution {
public:
priority_queue<int> q;
int maxIceCream(vector<int>& costs, int coins) {
int sum = 0;
for(int i=0; i<costs.size(); i++) {
sum += costs[i];
q.push(costs[i]);
if (sum > coins){
sum -= q.top();
q.pop();
}
}
return q.size();
}
};
2021/07/02