860.柠檬水找零
题目:力扣
//其实是一道简单的模拟题
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int b_5 = 0;
int b_10 = 0;
//int b_20 = 0;
for(int i = 0 ; i < bills.size(); ++i){
if(bills[i] == 5) b_5++;
else if(bills[i] == 10){
if(b_5 <= 0) return false;
else{
b_5--;
b_10++;
}
}else{
if(b_10 > 0){
b_10--;
if(b_5 > 0){
b_5--;
continue;
}else{
return false;
}
}else{
if(b_5 >= 3){
b_5 = b_5 - 3;
}else{
return false;
}
}
}
}
return true;
}
};
406.根据身高重建队列
题目:力扣
class Solution {
public:
static const bool cmp(vector<int>& a, 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> > result;
for(int i = 0; i < people.size(); ++i){
int pos = people[i][1];
result.insert(result.begin() + pos,people[i]);
}
return result;
}
};
//用链表加速
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的位置
std::list<vector<int>>::iterator it = que.begin();
while (position--) { // 寻找在插入位置
it++;
}
que.insert(it, people[i]);
}
return vector<vector<int>>(que.begin(), que.end());
}
};
452. 用最少数量的箭引爆气球
题目:力扣
class Solution {
public:
static const bool cmp(vector<int>& a, vector<int>& b){
//if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),cmp);
int ans = 1;
int begin = 0;
int end = 0;
int min_end = INT_MAX;
for(int i = 0; i < points.size(); ++i){
begin = points[i][0];
end = points[i][1];
min_end = min(end,min_end);
if(begin > min_end){
ans++;
min_end = end;
}
}
return ans;
}
};
总结
题型:贪心
技巧:两个维度的贪心,先确定一个维度的策略再确定另一个维度