目录
860 柠檬水找零
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
map<int, int> m;//用来记录5,10,20的数量
//找零只是到客户给出10或20的时候才找,如果给5块我们可以直接收了
for(int i = 0; i < bills.size(); i++){
if(bills[i] == 5){
m[bills[i]]++;//5元数量增加
}else if(bills[i] == 10){
if(m[5] == 0){//没5元了,找不了零
return false;
}
m[bills[i]]++;//10元数量增加
m[5]--;
}else if(bills[i] == 20){
if(m[10] >= 1 && m[5] >= 1){
m[bills[i]]++;//20元数量增加
m[5]--;
m[10]--;
}else if(m[10] == 0 && m[5] >= 3){
m[bills[i]]++;//20元数量增加
m[5]-= 3;
}else{//不符合上面两种情况返回找不了零
return false;
}
}
}
return true;
}
};
406 根据身高重建队列
class Solution {
public:
static bool cmp(const vector<int>& v1, const vector<int>& v2){
if(v1[0] == v2[0]) return v1[1] < v2[1];//如果身高相等就比较k值,k值是从小到大排(升序)
return v1[0] > v2[0];//我们要从大到小,所以返回 >
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);//从大到小排序
vector<vector<int>> queue;
for(int i = 0; i < people.size(); i++){
//得到每个数的k值,相当于这个数暂时要插入的位置。
//后面会有值再差进去,可能会改变原本的位置,但并不会影响整体的结构
int pos = people[i][1];
queue.insert(queue.begin() + pos, people[i]);
}
return queue;
}
};
452 用最少数量的箭引爆气球
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b){
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
int result = 1;//记录当前节点的位置;
if(points.size() == 0) return 0;
sort(points.begin(), points.end(), cmp);
for(int i = 1; i < points.size(); i++){
if(points[i][0] > points[i-1][1]){//下面那个气球的左边界,比上面那个气球的右边界还大,肯定就不会重复了
result++;
}else{
//如果下面气球的左边界在上面那个气球的范围里面
//我们就比较这两个气球的右边界那个短,取短的,因为取短的下面的气球才能实现和上面的气球重叠
//比如上面的那个图
points[i][1] = min(points[i][1], points[i-1][1]);
}
}
return result;
}
};