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

860. 柠檬水找零 - 力扣(LeetCode)

思路:

本题还是比较简单的,定义两个或者三个变量,用来分别统计收到5、10、20的数量。

从头遍历数组,若直接收到不是5元的,说明不可能找现,直接返回false。

若为5元,则++;

若为10元,判断当前是否有5元,若有,则可以

若为20的,则需要判断是否有10块的和5块的,若同时有,则可以、若没有十块的,但是有3张或以上的5块,则也可以,

若都不满足上面条件,则返回false;

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) 
    {
        if (bills[0] > 5)return false;
        //需要统计5元 10元数量
        int fiveNumber = 0;
        int tenNumber = 0;
        int twentyNumber = 0;
        for (int i = 0; i < bills.size(); i++)
        {
            if (bills[i] == 5)
                fiveNumber++;
            else if (bills[i] == 10 && fiveNumber > 0)
            {
                fiveNumber--;
                tenNumber++;
            }
            else if (bills[i] == 20)
            {
                if (fiveNumber > 0 && tenNumber > 0)//若我同时有十块的和五块,那我肯定得优先使用十块的去找零
                {
                    fiveNumber--;
                    tenNumber--;
                }
                else if (fiveNumber >= 3)
                {
                    fiveNumber-=3;
                }
                else return false;
            }
            else return false;
        }
        return true;
    }
};

406. 根据身高重建队列 - 力扣(LeetCode)

说实话,这道题的思路,属实想不到,本题的思路建议看代码随想录。

class Solution {
public:
    // 身高从大到小排(身高相同k小的站前面)
    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];
    }
    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--) { // 寻找在插入位置
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

本题的思路,考虑到重叠区间,先按照每个区间的左区间进行排序,然后从第一个区间开始来求交集,如果第二个鱼第一个有交集,说明我们能够一剑刺穿,这里如何判断是否有交集,那就是你的左区间在我的右区间之内或相等。但是后面要更新此时的右区间值,是取最小值。这一步很关键。

class Solution {
   
public:
    static bool cmp(const vector<int>& v1, const vector<int>& v2)
    {
        if (v1[0] == v2[0])return v1[1] > v2[1];
        return v1[0] < v2[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) 
    {
        if (points.size() == 1)return 1;
        sort(points.begin(), points.end(), cmp);//将其进行一个排序
        int ArrowNum = 1;
        int x= points[0][1];
        for (int i = 1; i < points.size(); i++)
        {
            if (points[i][0] <= x)
            {
                x = min(x, points[i][1]);//很关键这一步
                continue;
            }
            else {
                ArrowNum++;
                x = points[i][1];
            }
        }
        return ArrowNum;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值