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

文章介绍了三道算法题目的解决方案:860.柠檬水找零主要涉及找零策略;406.根据身高重建队列是关于排序和队列重建的题目;452.用最少数量的箭引爆气球涉及到区间覆盖问题。每道题都提供了C++代码实现和解题思路。
摘要由CSDN通过智能技术生成

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

860.柠檬水找零

题目链接:860.柠檬水找零,难度:简单
【实现代码】

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int change[2] = {0};
        for (int i = 0; i < bills.size(); i++) {
            if (bills[i] == 5) {
                change[0]++;
            } else if (bills[i] == 10) {
                change[0]--;
                change[1]++;
            } else if (bills[i] == 20) {
                change[0]--;
                if (change[1] == 0) {
                    change[0] -= 2;
                } else {
                    change[1]--;
                }                
            }
            // cout << change[0] << "  " << change[1] << endl;
            if (change[0] < 0 || change[1] < 0) {
                return false;
            }
        }
        return true;
    }
};

【解题思路】

需要注意的是,5块和10块是分开计数的,而且当十块不够的时候可以使用5块的。

406. 根据身高重建队列

题目链接:406. 根据身高重建队列,难度:中等
【实现代码】

class Solution {
public:
    static bool cmp(const vector<int>& people1, const vector<int>& people2) {
        if (people1[0] == people2[0]) {
            return people1[1] < people2[1];
        } else {
            return people1[0] > people2[0];
        }
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), cmp);
        // for (int i = 0; i < people.size(); i++) {
        //     cout << people[i][0] << " " << people[i][1] << endl;
        // }
        list<vector<int>> queue;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            list<vector<int>>::iterator it = queue.begin();
            while (position--) {
                it++;
            }
            queue.insert(it, people[i]);
        }
        return vector<vector<int>>(queue.begin(), queue.end());
    }
};

【解题思路】

首先是对原数组进行排列,按照身高降序和k值升序的顺序排列。
接着是插入到新的数组里,应该按照对应k值进行操作。
因为vector的底层结构是数组,插入和删除操作都是O(n^2),所以使用链表进行存储新的队列。

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

题目链接:452. 用最少数量的箭引爆气球,难度:中等
【实现代码】

class Solution {
public:
    static bool cmp(vector<int>& point1, vector<int>& point2) {
        return point1[0] < point2[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(), points.end(), cmp);
        int result = 1;
        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], points[i - 1][1]);
            }
        }
        return result;
    }
};

【解题思路】

这一题主要是找重叠的坐标范围,首先也是对坐标进行排序,按照第一个x进行升序排列。
之后找重叠的范围,每次要找到相邻两个坐标的最大重叠坐标x;如果下一个的第一个x大于前一个坐标的第二个x,则需要重新射一箭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值