Leetcode 1564 把箱子放进仓库里1

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]),0ki。这样我们只需要判断每个箱子是否高于区间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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值