算法刷题Day 35 柠檬酸找零+根据身高重建队列+用最少数量的箭引爆气球

Day 35 贪心算法

860. 柠檬水找零

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        unordered_map<int, int> table;

        for (int i = 0; i < bills.size(); i++)
        {
            switch (bills[i])
            {
            case 5:
                table[5]++;
                break;
            case 10:
                if (table[5] > 0)
                {
                    table[5]--;
                    table[10]++;
                }
                else
                {
                    return false;
                }
                break;
            case 20:
                if (table[10] > 0 && table[5] > 0)
                {
                    table[10]--;
                    table[5]--;
                }
                else if (table[5] >= 3)
                {
                    table[5] -= 3;
                }
                else 
                {
                    return false;
                }
                break;
            }
        }

        return true;
    }
};

406. 根据身高重建队列

本题有两个维度,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列

先排身高(从大到小),再排第二个条件

class Solution {
    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);

        list<vector<int>> que;
        for (int i = 0; i < people.size(); i++)
        {
            int position = people[i][1];
            auto iter = que.begin();
            while (position--) 
            {
                iter++;
            }
            que.insert(iter, people[i]);
        }

        return {que.begin(), que.end()};
    }
};

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

class Solution {
    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;
        int result = 1; // 至少需要一支箭
        sort(points.begin(), points.end(), cmp);

        for (int i = 1; i < points.size(); i++)
        {
            if (points[i][0] > points[i - 1][1])
            {
                result++;
            }
            else
            {
                points[i][1] = min(points[i - 1][1], points[i][1]);
            }
        }

        return result;
    }
};

你可能感兴趣的:(算法)