联系一下美团三面的题。两个排序数组,进行合并。
[[1, 3], [6, 10]], [[2, 5], [7, 11]]
合并: [[1, 5], [6, 11]]
解题方法就是每次抽取两个数组中首位最小的,然后与前面提取的末位进行比较,如果小于末位,就可以融合,否则新起一组。
下面的题目其实就是求 最大的有公共区间的数目。
这道题极有可能面试题,第一种做法很常规,记录每次的结束时间,但是需要排序,因为只需要确定当前的开始时间比记录的结束时间大,那么就不需要增加一个老师。
heapq主要是heapq.heappush和heapqpop得到的就是堆。但是如果是一开始就是List,可以用heapsort。其实要注意,heapq.heapify就是变成堆,但是堆的顺序不代表堆排序后的顺序!!!堆排序后才能得到从小到大的数组。–堆排序可以是最小堆每次拿出第一个。
import heapq
class Solution:
def minmumNumberOfHost(self , n , startEnd ):
# write code here
# 这里用堆的原因其实很明显,先开始不代表先结束。所以我需要把进入堆里的最早结束的进行对比
res = []
result = 0
startEnd = sorted(startEnd, key= lambda x:x[0])
for i in range(0, n):
while res:
if startEnd[i][0] >= res[0]:
heapq.heappop(res)
else:
break
heapq.heappush(res, startEnd[i][1])
if len(res) > result:
result = len(res)
return result
其实细想两种方法是一致的,只是把结束时间提前排了序号。
如果是完全没有交集,那么必定下一位的开头肯定比上一位的结尾大。
[[1,3],[5,6],[7,8]], 如果不大,说明出现交集。那么如果判断到底多少个有交集。那么就是这一位不往后移动了,继续与下一个的开头比较,如果还是小,继续添加老师人数。也就是第二种做法~
class Solution:
def minmumNumberOfHost(self , n , startEnd ):
# write code here
res = []
result = 0
end = 0
res1 = sorted(startEnd, key = lambda x:x[0])
res2 = sorted(startEnd, key = lambda x:x[1])
for i in range(len(res1)):
if res1[i][0] >= res2[end][1]:
end += 1
else:
result += 1
return result