算法体系结构第七课

一、最大线段重合问题
给定许多线段,返回重合线段区域最多的线段数(规定每条线段都是从整数开始)

挫办法:计算每个 .5被多少给定的线段包含,返回最大的 .5的线段数
实现:取到最大最小值,最小值每次加 0.5,对每个 .5进行判断即可

好办法:对每条线段按照最小值的大小进行排序,依次选取线段,弹出堆中小于线段起始点的元素,将线段的结尾点放入堆中,堆中的元素的数量便是这条线段的起始点的重叠条数
实现:用一个line类收集每条线段的始末位置,遍历每条线段,把小于起始点的元素都弹出,将线段的结尾点放入堆中,获取堆的大小,它便是结果;

二、加强堆
提供了通过堆中的元素寻找到该元素所在的位置的一张表

三、购物抽奖活动
描述:
1.有两个数组,arr 和op,arr负责记录每个时间点有哪个用户(以数字id表示)在操作,op负责记录每个时间点(就是数组下标)用户操作的什么,T表示买一件商品,F表示退货,
2.有一个中奖区和一个候选区,如果中奖区是空的,用户买一件就进来,如果中奖区满了,用户买一件就进入候选区,
3.买的多的用户可以挤掉中奖区中进入较早、买的较少的客户,
4.如果中奖区有一个客户退货了,恰好候选区有多个用户同时满足了条件可以进入中奖区,则其中进入候选区时间早的客户进入
5.进入候选区或者中奖区的时候时间点才需要改变
6.如果用户在购买数是0时退货,当作没看到
7.每个时间点都需要一个中奖区名单

挫办法:
1.Customer类包含id,件数和时间点,map采用HashMap负责记录客户和id,ArrayList用于记录候选区和中奖区的客户,ans是一个嵌套的二层List,
2.对每个时间点进行遍历,如果是退货并且map里没有这个id,就直接把当前的中奖区放入ans中,
3.如果map不含这个id,那就把它初始化,也就是new出这个类,件数和时间点都设为0,在之后进行调整
4.如果是买,buy++,卖就buy- -,后判断buy ?= 0,是的话就直接移除这个用户,
5.如果用户第一次购买,就是既不在爹区又不在候选区,那该去哪去哪,
6.中奖区和候选区清除买了0件的人,
7.候选区按照件数降序,时间升序进行排列,中奖区按照件数升序,时间降序进行排列,(这样做可以比较候选区最该进去的和中奖区最该出来的)
8.move方法:中奖区中的人该出出就出出
9.把当前的daddy放入ans中

好办法:
用加强堆

猜你喜欢

转载自blog.csdn.net/dgytjhe/article/details/119581431
今日推荐