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;
    }
};
相关推荐
程序员buddha10 小时前
C语言数组详解
c语言·开发语言·算法
蒙奇D索大12 小时前
【算法】递归算法的深度实践:从布尔运算到二叉树剪枝的DFS之旅
笔记·学习·算法·leetcode·深度优先·剪枝
卡提西亚12 小时前
C++笔记-25-函数模板
c++·笔记·算法
ghie909012 小时前
MATLAB/Simulink水箱水位控制系统实现
开发语言·算法·matlab
多多*13 小时前
分布式系统中的CAP理论和BASE理论
java·数据结构·算法·log4j·maven
yuan1999713 小时前
基于粒子群优化(PSO)算法的PID控制器参数整定
算法
R&L_2018100113 小时前
C++之内联变量(Inline Variables)
c++·c++新特性
小白程序员成长日记13 小时前
2025.11.10 力扣每日一题
数据结构·算法·leetcode
hoiii18713 小时前
基于交替方向乘子法(ADMM)的RPCA MATLAB实现
人工智能·算法·matlab
fengfuyao98514 小时前
MATLAB的加权K-means(Warp-KMeans)聚类算法
算法·matlab·kmeans