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

Leetcode 860. 柠檬水找零

题目链接 860 柠檬水找零

本题目比较简单,我一开始并没有看出有需要贪心的地方,看了一下解析:

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

下面上代码:

cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0;
        int ten = 0;
        int ershi = 0;
        for(int i=0;i<bills.size();i++){
            if(bills[i] == 5){
                five++;
            }
            if(bills[i] == 10){
                if(five>0){
                    five--;
                    ten++;
                }
                else{
                    return false;
                }
            }
            if(bills[i] == 20){
                if(ten>0&&five>0){
                    ten--;
                    five--;
                    ershi++;
                }else if(five>=3){
                    five-=3;
                    ershi++;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
};

Leetcode 406. 根据身高重建队列

题目链接 406 根据身高重建队列

本题目和分糖果那个题目差不多,也是两个维度分开分析,首先先按照高度排序,再根据k来进行插入操作,但是我觉得好难想,这里学习了一个新的知识点,就是vector底层实现和它的扩容操作,下面直接上代码:

cpp 复制代码
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
    // 身高从大到小排(身高相同k小的站前面)根据题目要求
    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);
        list<vector<int>> que;// list底层是链表实现,插入效率比vector高的多
        for(int i=0;i<people.size();i++){
            int position = people[i][1];// 插入到下标为position的位置
            std::list<vector<int>>::iterator it = que.begin();
            while(position--){// 寻找在插入位置,这里的position作为索引下标,是很难想象的
                it++;
            }
            que.insert(it,people[i]);
        }
        return vector<vector<int>>(que.begin(),que.end());
    }
};

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

题目链接 452 用最少数量的箭引爆气球

本题目的贪心思想还是比较明显的,让气球重叠最大话就能用最少的箭引爆气球,只需讨论重叠和不重叠的情况即可,在这之前要对左边界或者右边界进行排序,重叠情况画个图即可明白,下面上代码:

cpp 复制代码
class Solution {
    private:
    static bool cmp(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(),cmp);//左边界,从小到大排序
        int result = 1;
        for(int i=1;i<points.size();i++){
            if(points[i-1][1]<points[i][0]){//不重合的情况
                result++;
            }else{
                points[i][1] = min(points[i-1][1],points[i][1]);//重合的情况,继续判断下一个气球范围是否重合
            }
        }
        return result;
    }
};

end liujiliujibiewangle

相关推荐
小则又沐风a9 分钟前
类和对象(C++)---上
java·c++·算法
季明洵15 分钟前
动态规划及背包问题
java·数据结构·算法·动态规划·背包问题
busideyang21 分钟前
函数指针类型定义笔记
c语言·笔记·stm32·单片机·算法·嵌入式
Wect22 分钟前
LeetCode 215. 数组中的第K个最大元素:大根堆解法详解
前端·算法·typescript
蒸汽求职22 分钟前
【蒸汽教育求职干货】OPT只剩3个月还没找到工作,怎么办?——留学生IT求职的“紧急预案”
人工智能·经验分享·面试·职场和发展·美国求职
蒸汽求职25 分钟前
【蒸汽教育求职分享】美国IT面试的Behavioral Question:STAR法则人人都知道,但90%的人用错了
人工智能·面试·职场和发展·github·求职招聘·留学生求职
深邃-33 分钟前
数据结构-双向链表
c语言·开发语言·数据结构·c++·算法·链表·html5
2401_8785302135 分钟前
分布式任务调度系统
开发语言·c++·算法
中小企业实战军师刘孙亮36 分钟前
什么是增长陷阱?中小企业“增长陷阱”破局指南-佛山鼎策创局破局增长咨询
职场和发展·新媒体运营·创业创新·需求分析·内容运营
_深海凉_1 小时前
LeetCode热题100-两数之和
算法·leetcode·职场和发展