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...