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

 860.柠檬水找零

思路:

设立钱箱count(3,0)

分成三种情况:

1. 5元钞票,count[0]++;

2. 10元钞票, 判断count[0]是否有钱返回(count[0]==0),没有返回false. count[0]--,count[1]++

3. 20元钞票,分情况判断,优先用10块:count[0]>=1 && count[1]>=1。或者:count[0]>=3,否则return false;

最后return true;

看视频后:

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。


406.根据身高重建队列

思路:

本题有两个需要处理的参数:身高和排序,需要分别进行处理。先确定身高再确定排序,但是找不到排序固定的判断。

看视频后:

如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。

按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。那么只需要按照k为下标重新插入队列就可以了。后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

for(int i=0;i<people.size();i++)

        {

            int position = people[i][1];

            result.insert(result.begin()+position, people[i]);

        }

注意自定义sort排序:

sort(people.begin(),people.end(),cmp);

cmp一定是static的:

static bool cmp(vector<int> &a, vector<int> &b)

    {

        if(a[0]==b[0])

            return a[1] < b[1];

        return a[0] > b[0];

    }

输出result;


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

思路:

先sort原数组,根据内部数组的[0]进行从小到大的排列。

数组compare为points[0]。用compare记录每次与新数组的交集。如果交集为空compare[1]<points[i][0],则count加1且compare更新为新数组。最后count++,return count。

局部最优:按顺序找到两个区域的交集,再更新下一个区域。

全局最优:按顺序找到最多区域的交集,再更新下一个区域。

看视频后:

局部最优:当气球出现重叠,一起射,所用弓箭最少。

全局最优:把所有气球射爆所用弓箭最少。

先对数组进行排序,如果数组元素个数等于0则return 0. 如果不为0,则至少一只箭,所以result初始化等于1.

如果气球和前一个气球不挨着,即points[i][0]>points[i-1][1], result++;如果挨着,则缩小右边界找交集,point[i][1]= min(points[i-1][1], points[i][1]);最后返回result。

在原数组上修改则不需要建一个数组进行记录。

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]);

            }

        }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容