Day35 贪心算法 part04 860. 柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球

贪心算法 part04 860. 柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球

860. 柠檬水找零

c 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        vector<int> count(2,0); //count[0]记录5美元,count[1]记录10美元
        for(int i = 0; i<bills.size();i++){
            if(bills[i]==5) count[0]++;
            else if(bills[i]==10){
                if(count[0]<=0) return false;
                else{
                    count[0]--;
                    count[1]++;
                }
            }
            else if(bills[i]==20){ 
                if(count[1]<=0){ //如果10美元没有,我们尝试找零3个5美元
                    count[0]-=3;
                }else{ //有10美元,找零一个5美元+一个10美元
                    count[0]--;
                    count[1]--;
                }
                if(count[0]<0) return false; //如果5美元用光,没法找零
            }
        }
        return true;
    }
};

406. 根据身高重建队列

尤其注意vector扩容机制对时间的消耗,优先采用list链表存储

c 复制代码
class Solution {
public:
    static bool Compare(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) {
        list<vector<int>> que; //记录结果
        sort (people.begin(), people.end(), Compare); //排序操作,身高从高到低
        for(int i = 0; i< people.size();i++){
            int pos = people[i][1];
            list<vector<int>>::iterator it = que.begin();
            while(pos--){ //it只会遍历到que.end()位置
                it++;
            }
            que.insert(it,people[i]);
        }
        return vector<vector<int>>(que.begin(),que.end());
    }
};

452. 用最少数量的箭引爆气球

c 复制代码
class Solution {
private:
static bool Compare(const vector<int>& a, const vector<int>& b) {
    return a[0] < b[0];
}
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if (points.size() == 0) return 0;
        sort(points.begin(), points.end(), Compare);

        int result =1; //记录结果
        for(int i = 0; i<points.size()-1;i++){
            if(points[i][1] <points[i+1][0]) result++;  //上个气球右边界小于下个气球左边界,二者无重叠区间
            else{
                points[i+1][1] = points[i+1][1] < points[i][1] ?  points[i+1][1] : points[i][1];
            }
        }
        return result;
    }
};
相关推荐
少许极端28 分钟前
算法奇妙屋(五)-链表
数据结构·算法·链表
Test.X34 分钟前
学习16天:pytest学习
学习·pytest
XISHI_TIANLAN43 分钟前
【多模态学习】Q&A6: 什么是MOE架构?Router Z Loss函数是指什么?负载均衡损失(Load Balancing Loss)又是什么?
学习·算法·语言模型
木子.李3471 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法
yolo_guo1 小时前
sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码
linux·c++·sqlite
Diligence8151 小时前
计算机网络学习总结(二)应用层
学习·计算机网络
花心蝴蝶.1 小时前
API签名认证算法全解析
算法
兮山与1 小时前
算法6.0
算法
代码对我眨眼睛1 小时前
739. 每日温度 LeetCode 热题 HOT 100
算法·leetcode
小墨宝2 小时前
web前端学习LangGraph
前端·学习