860. 柠檬水找零
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
unordered_map<int, int> pocket;
pocket[20]=0;
pocket[10]=0;
pocket[5]=0;
for(int i=0; i<bills.size(); i++){
pocket[bills[i]]++;
int payBack = bills[i]-5;
if (payBack==15){
if(pocket[10]>=1&&pocket[5]>=1){
pocket[10]-=1;
pocket[5]-=1;
}
else if(pocket[5]>=3){
pocket[5]-=3;
}
else return false;
}
if (payBack==5){
if (--pocket[5]<0) return false;
}
cout << payBack <<endl;
}
return true;
}
};
406.根据身高重建队列
思路:先以k升序排列,确保每个人前面比自己高的人的数量没问题。再按身高降序排列,保证前面的人一定比后面的人高。第二次排序按照k即前面有几个人比我高排序,如果当前元素的k比小于自己的序号i则说明位置不对,因为前面的人都比我高,但是我前面的人比我多,说明我应该在更前面的位置,所以直接将钙元素向前插入第k个位置。
class Solution {
public:
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); //先按h排序
vector<vector<int>> queue;
for (int i=0; i<people.size(); i++){
int position=people[i][1];//按k排序
queue.insert(queue.begin()+position, people[i]);
}
return queue;
}
};
452. 用最少数量的箭引爆气球
class Solution {
public:
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());
int result=1;//从i=1开始遍历,至少需要一根箭
for (int i=1; i<points.size(); i++){
if (points[i][0]>points[i-1][1]){ //i的左边界大于i-1的右边界
result++;
}
else{//更新当前元素右边界一定小于等于i-1的右边界,保证该球和上一个球能被射穿
points[i][1] = min(points[i][1], points[i-1][1]);
}
}
return result;
}
};