代码随想录算法训练营33期 第三十五天 |860. 柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值