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;
    }
};
相关推荐
Dev7z19 小时前
基于MATLAB数学形态学的边缘检测算法仿真实现
算法·计算机视觉·matlab
kyle~1 天前
C++---value_type 解决泛型编程中的类型信息获取问题
java·开发语言·c++
盐焗西兰花1 天前
鸿蒙学习实战之路:状态管理最佳实践
学习·华为·harmonyos
NiNi_suanfa1 天前
【Qt】Qt 批量修改同类对象
开发语言·c++·qt
信奥胡老师1 天前
苹果电脑(mac系统)安装vscode与配置c++环境,并可以使用万能头文件全流程
c++·ide·vscode·macos·编辑器
妖灵翎幺1 天前
C++ 中的 :: 操作符详解(一切情况)
开发语言·c++·ide
风筝在晴天搁浅1 天前
代码随想录 718.最长重复子数组
算法
kyle~1 天前
算法---回溯算法
算法
小毅&Nora1 天前
【人工智能】【深度学习】 ⑦ 从零开始AI学习路径:从Python到大模型的实战指南
人工智能·深度学习·学习
Maxwell_li11 天前
Pandas 描述分析和分组分析学习文档
学习·数据分析·numpy·pandas·matplotlib