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

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

860.柠檬水找零

对于柠檬水找零,顾客只会给5,10,20元面值的钱,如果给到5元还好,如果给的是10或者20,我们则需要找零,就需要保证,面值为5或者10的钱够找才行。
因此,当我们收到20元面值时,我们优先使用一张10元与一张5元进行找零,因为使用3张5元会导致10元面值滞留,只有当10元不够时,才用3张5元进行找零,收到10元时,我们使用一张5元进行找零。
因此,我们定义两个变量,five与ten,分别用来记录五元与十元的数量。
遇到5元,则five++,遇到十元则,ten++,five–。
遇到20元,如果有十元面值,则ten–,five–,没有十元。则five-=3;
每轮循环结束,判断five与ten是否小于零。小于零,就返回false。循环最终结束依旧没有返回false,那我们返回true。

代码

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

406.根据身高重建队列

这道题包括两个维度的信息,身高与比他高的人,因此,我们可以一个一个维度去处理。
如果以比他高的人进行排序的话,那么会使得,身高的排序是乱的,我们无法进一步处理,因此,我们先按照身高进行排序。
排序规则为,对于不同身高的人,我们让身高大的站在前面,相同身高的人,Ki大的(比本人身高大的人数)站在后面。
排序规则

 static bool cmp(const vector<int> &a,const vector<int>&b)
    {
        if(a[0]==b[0]) return a[1]<b[1];
        else return a[0]>b[0];
    }

此时,我们得到了一个关于身高排序的序列,我们遍历一次数组,因为这个数组是按身高排的序,因此某个元素之前都是比这个元素大的,因此,我们只需将这个数组的元素people[ii]插入到合适的位置people[ii][1]的位置即可。

代码

class Solution {
public:
    static bool cmp(const vector<int> &a,const vector<int>&b)
    {
        if(a[0]==b[0]) return a[1]<b[1];
        else return a[0]>b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>>que;
        for(int ii =0;ii<people.size();ii++)
        {
            int position = people[ii][1];
            que.insert(que.begin()+position,people[ii]);
        }
        return que;
    }
};

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

对于引爆气球,我们可以先对气球进行排序,将左边界小的放在左边,如果左边界相同,就把有边界小的放在左边。

static bool cmp(const vector<int>&a,const vector<int>&b)
{
    if(a[0]==b[0]) return a[1]<b[1];
    else return a[0]<b[0];
}

我们先进行判断,如果气球只有一个,那么我们返回1即可。如果有多个气球,射爆第一个气球一定需要一支弓箭,我们只需判断射爆下一个气球需不需要多一支弓箭。
因此我们从第二个气球判断,如果第二个气球的左边界大于了第一个气球的有边界,则一定需要一支弓箭,如果没有,则说明两个气球有重叠,我们可以省一支弓箭,我们将第二个气球的有边界设置为第一个气球和这个气球的有边界最小值,这样就可以避免第二个气球内含与第一个气球之中了。根据此逻辑,我们可以写出代码

代码

class Solution {
public:
static bool cmp(const vector<int>&a,const vector<int>&b)
{
    if(a[0]==b[0]) return a[1]<b[1];
    else return a[0]<b[0];
}
    int findMinArrowShots(vector<vector<int>>& points) {
        if(points.size()==1) return 1;
        sort(points.begin(),points.end());
        int num =1;
        for(int ii =1;ii<points.size();ii++)
        {
            if(points[ii][0]>points[ii-1][1]) num++;
            else points[ii][1]=min(points[ii][1],points[ii-1][1]);
        }
        return num;
    }
};

你可能感兴趣的:(leetcode,算法,数据结构)