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

题目链接:860. 柠檬水找零 - 力扣(LeetCode)

class Solution
{
public:
    bool lemonadeChange(vector<int> &bills)
    {
        int five=0;
        int ten=0;

        for(int i:bills){
            if(i==5){
                five++;
            }else if(i==10){
                five--;
                ten++;
            }else if(i==20&&ten>0){
                ten--;
                five--;
            }else{
                five-=3;
            }
            if(five<0) return false;
        }

        return true;
    }
};

常识解题,没有任何思路。

题目链接:406. 根据身高重建队列 - 力扣(LeetCode)

class Solution
{
private:
    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];
    }
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>> &people)
    {
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>> que;
        for(int i=0;i<people.size();i++){
            que.insert(que.begin()+people[i][1],people[i]);
        }
        return que;
    }
};

有两个干扰排列的因素,就是有两个维度。我们要先解决其中一个在解决另一个,如果一起解决只会互相干扰。

那么我们先来排列身高,因为如果身高从大到小排好了,那么后面我们在对人数k进行排列,是按照遍历顺序先对高的人进行操作,然后矮的人可以顺理成章的按照人数插在高的前面或后面,因为高的人影响人数,矮的人不影响。

题目链接:452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

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 arrow=1;

            for (int i = 1; i < points.size(); i++)
        {
            if (points[i - 1][1] < points[i][0])
            {
                arrow++;
            }else{
                points[i][1]=min(points[i-1][1],points[i][1]);//右边界选小的,如果下一个可以和最小的那个凑一起那就不用给箭了
            }
        }
        return arrow;
    }
};

一个可以想到但是很模糊的思路。

根据左边的坐标排列好,然后对右边进行操作,判断右边的边界有没有概括下一个元素的左边界就知道有没有重复了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值