354 俄羅斯套娃信封問題

2021-10-05 05:23:46 字數 2586 閱讀 7691

354. 俄羅斯套娃信封問題

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (w, h) 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。

請計算最多能有多少個信封能組成一組「俄羅斯套娃」信封(即可以把乙個信封放到另乙個信封裡面)。

說明:不允許旋轉信封。

示例:

輸入: envelopes =[[

5,4]

,[6,

4],[

6,7]

,[2,

3]]輸出:

3 解釋: 最多信封的個數為 3

, 組合為:[2

,3]=

>[5

,4]=

>[6

,7]。

狀態定義:

dp[i] 為前i個元素以第i個元素結尾時的狀態(最多組成幾個套娃)。

class

solution

:def

maxenvelopes

(self, envelopes: list[list[

int]])

->

int:

iflen

(envelopes)

<=1:

return

len(envelopes)

envelopes.sort(key=

lambda item: item[0]

) dp =[1

for i in

range

(len

(envelopes))]

max_env =

0for i in

range(1

,len

(envelopes)):

max_i =

1for j in

range(0

,i):

if envelopes[i][0

]> envelopes[j][0

]and envelopes[i][1

]> envelopes[j][1

]:max_i =

max(max_i,dp[j]+1

) dp[i]

= max_i

print

(dp)

return

max(dp)

執行結果:超時

嘗試1o(n

2)

o(n^2)

o(n2

)時間複雜度,考慮到lis問題的改進nlogn演算法,dp[i] 為構成的i個上公升序列中最後乙個 元素的最小值。

排序:二分法查詢時,對於二維的情況不好比較判斷,應對信封排序,將其變成乙個一維的lis問題。排序演算法盡可能將小的信封放在前面。

只是簡單的按照x[0]排序還不夠,對於x[0]相等的元素繼續按照x[1]降序排序。降序的作用是演算法上公升子串行中x[0]相等的元素只挑選其中乙個。

import functools

class

solution

:def

maxenvelopes

(self, envelopes: list[list[

int]])

->

int:

iflen

(envelopes)

<=0:

return

len(envelopes)

cmp=

lambda x,y:x[0]

-y[0

]if x[0]

!= y[0]

else y[1]

- x[1]

envelopes.sort(key= functools.cmp_to_key(

cmp)

)print

(envelopes)

dp =

[envelopes[0]

]for i in

range(1

,len

(envelopes)):

left,right =0,

len(dp)

while left < right:

mid =

(left + right)//2

if envelopes[i][1

]> dp[mid][1

]:left = mid +

1else

: right = mid

iflen(dp)

== left:

)else

: dp[left]

= envelopes[i]

return

len(dp)

之前對於lis和最大子序和問題定義的狀態理解有偏差。兩者dp[i]都是代表以第i個元素結尾是的子序或者子串的狀態。

最大子序和中沒有明確指定i元素之前的元素的起始位置以及都是哪幾個元素的組合

子串問題中指定了子串的末位置i,沒有明確指定子串的起始位置。

354 俄羅斯套娃信封問題

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。輸入 envelop...

354 俄羅斯套娃信封問題

給你乙個二維整數陣列 envelopes 其中 envelopes i wi,hi 表示第 i 個信封的寬度和高度。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算 最多能有多少個 信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信...

俄羅斯套娃信封問題(LeetCode 354)

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...