Leetcode 1564 把箱子放进仓库里1
题目描述:给定两个正整数数组 boxes 和 warehouse ,分别包含单位宽度的箱子的高度,以及仓库中 n 个房间各自的高度。仓库的房间分别从 0 到 n - 1 自左向右编号, warehouse[i] (索引从 0 开始)是第 i 个房间的高度。
箱子放进仓库时遵循下列规则:
箱子不可叠放。
你可以重新调整箱子的顺序。
箱子只能从左向右推进仓库中。
如果仓库中某房间的高度小于某箱子的高度,则这个箱子和之后的箱子都会停在这个房间的前面。
你最多可以在仓库中放进多少个箱子?
思路:这道题是一道典型的贪心,很显然我们从小到大放箱子是最优的。但是在WA了两次以后,我意识到自己少考虑了一个问题,就是在放箱子时,不能只考虑该箱子和对应房间高度的大小关系,你还要考虑你能不能从左边推进去。于是很菜的我又卡在了这个地方(没想到怎么O(1))……
我们考虑如何O(1)地判断能不能推进去,开始时,我们维护一个区间最小值列表,也就是
m
i
n
[
i
]
=
m
i
n
(
w
a
r
e
h
o
u
s
e
[
k
]
)
,
0
≤
k
≤
i
min[i]=min(warehouse[k]), 0\leq{k}\leq{i}
min[i]=min(warehouse[k]),0≤k≤i。这样我们只需要判断每个箱子是否高于区间0~i的最小值,就可以判断这个箱子能不能放进去了(我觉得这才是本题的贪心之处而非排序)
class Solution(object):
def maxBoxesInWarehouse(self, boxes, warehouse):
"""
:type boxes: List[int]
:type warehouse: List[int]
:rtype: int
"""
boxes = sorted(boxes)
length01 = len(boxes)
length02 = len(warehouse)
ans, j= 0, 0
for i in range(1,length02,1):
warehouse[i] = min(warehouse[i], warehouse[i-1])
for i in range(length02-1,-1,-1):
if j <= length01-1 and boxes[j] <= warehouse[i]:
ans += 1
j += 1
return ans