代码随想录算法训练营第三十天|leetcode406、452、860题

本文解析了LeetCode中的三个问题:第860题找零算法、第406题队列重构(按身高排序)和第452题最少箭数求解(气球重叠)。介绍了如何利用编程技巧解决这些与数据结构和排序相关的问题。

一、leetcode第860题

本题要求是否能给顾客正确找零,由于收的钱金额只有5、10、20三种,因此在遇到5元时直接收入,遇到10元需要找零5元,遇到20元优先找零10+5,如果,没有10元则找零5+5+5,每次找零后看5、10两种金额是否为负来判断能否正确找零。

具体代码如下:

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

二、leetcode第406题

本题要求根据身高要求重建队列,由于有两方面需要考虑,因此首先将元素按身高进行排列,然后将排列在前比自己高的人数作为插入的序号向前插入,最后得到的队列即为正确的身高队列。

具体代码如下:

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

 三、leetcode第452题

本题要求解扎爆气球所需的最少箭数,也就是求有多少气球的区间是重叠在一起的。首先将给定的数组按照气球的左边界进行排序,如果下一个气球的左边界大于上一个气球的右边界则表明这两个气球没有重叠部分,所射箭数要加1,反之,需要判断该气球的下一个气球是否也与上面的气球重叠,这里要对右边界进行变换,取这两个气球右边界的最小值,如果重叠,则不用再将箭数加1。

具体代码如下:

class Solution {
public:
    static bool cmp(const vector<int>&a,const vector<int>&b)
    {
        return a[0]<b[0];
    }
    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],points[i-1][1]);
        }
    }
    return result;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值