Leetcode 1564 把箱子放進倉庫裡1

2021-10-10 02:32:04 字數 1503 閱讀 4108

題目描述:給定兩個正整數陣列 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 ...