題目描述:給定兩個正整數陣列 boxes 和 warehouse ,分別包含單位寬度的箱子的高度,以及倉庫中 n 個房間各自的高度。倉庫的房間分別從 0 到 n - 1 自左向右編號, warehouse[i] (索引從 0 開始)是第 i 個房間的高度。
箱子放進倉庫時遵循下列規則:
箱子不可疊放。
你可以重新調整箱子的順序。
箱子只能從左向右推進倉庫中。
如果倉庫中某房間的高度小於某箱子的高度,則這個箱子和之後的箱子都會停在這個房間的前面。
你最多可以在倉庫中放進多少個箱子?
思路:這道題是一道典型的貪心,很顯然我們從小到大放箱子是最優的。但是在wa了兩次以後,我意識到自己少考慮了乙個問題,就是在放箱子時,不能只考慮該箱子和對應房間高度的大小關係,你還要考慮你能不能從左邊推進去。於是很菜的我又卡在了這個地方(沒想到怎麼o(1))……
我們考慮如何o(1)地判斷能不能推進去,開始時,我們維護乙個區間最小值列表,也就是min
[i]=
min(
ware
hous
e[k]
),0≤
k≤
imin[i]=min(warehouse[k]), 0\leq\leq
min[i]
=min
(war
ehou
se[k
]),0
≤k≤i
。這樣我們只需要判斷每個箱子是否高於區間0~i的最小值,就可以判斷這個箱子能不能放進去了(我覺得這才是本題的貪心之處而非排序)
class
solution
(object):
defmaxboxesinwarehouse
(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,
0for 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-
1and boxes[j]
<= warehouse[i]
: ans +=
1 j +=
1return ans
leetcode 面試題45 把陣列排成最小的數
解題思路 這道題的關鍵就在於如何重新定義排序規則,對待排序的字串x和y,如果 x y 構成的字串小於 y x 構成的字串,自然x應當排在y前面,反之亦然 class solution def minnumber self,nums list int str defcmp x,y if x y y x...
LeetCode 回溯 把數字翻譯成字串
給定乙個數字,我們按照如下規則把它翻譯為字串 0 翻譯成 a 1 翻譯成 b 11 翻譯成 l 25 翻譯成 z 乙個數字可能有多個翻譯。請程式設計實現乙個函式,用來計算乙個數字有多少種不同的翻譯方法。示例 輸入 12258 輸出 5 解釋 12258有5種不同的翻譯,分別是 bccfi bwfi ...
leetcode 面試題46把數字翻譯成字串
解題思路 動態規劃,1 得到num的每一位數字,從低位到高位用nums儲存 2 從低位到高位依次求解,狀態轉移方程如下 d p i dp i 1 dp i 2 10 leq nums i 10 nums i 1 26 dp i 1 others end right.dp i dp i 1 dp i ...