Day30 贪心专项

860. 柠檬水找零

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

406. 根据身高重建队列

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), [](vector<int> val1, vector<int> val2){
            if (val1[0] == val2[0]) return val1[1] < val2[1];
            return val1[0] > val2[0];
        });

        // vecotr时间复杂度高,可以用list
        // vector<vector<int>> queue;
        // for (int i = 0; i < people.size(); i++) {
        //     int position = people[i][1];
        //     queue.insert(queue.begin() + position, people[i]);
        // }
        // return queue;

        std::list<vector<int>> list;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            std::list<vector<int>>::iterator it = list.begin();
            while(position--) {
                it++;
            }
            list.insert(it, people[i]);
        }

        return vector<vector<int>>{list.begin(), list.end()};
    }
};

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

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if(points.size() == 0) return 0;

        sort(points.begin(), points.end(), [](const vector<int> &l_points, const vector<int> &r_points){
            return l_points[0] < r_points[0];
        });

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

        return shots;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值