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

2021-09-22 07:58:38 字數 1441 閱讀 7395

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

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

說明:

不允許旋轉信封。

示例:

輸入: envelopes = [[5,4],[6,4],[6,7],[2,3]]

輸出: 3

解釋: 最多信封的個數為 3, 組合為: [2,3] => [5,4] => [6,7]。

暴力的動態規劃方法(可能超時)

public

intmaxenvelopes

(int

envelopes)}}

//對於每個信封,它能塞進的信封都只可能出現在它右側

//res記錄以第i個信封為最後乙個(套娃中最小的套娃),它的「俄羅斯套娃」信封個數。例如長寬最大的信封,res[i]=1

//從右往左遍歷,對於第i個信封,遍歷其i+1至最後乙個信封。

//如果當前信封的長和寬都比第i個信封的大,那麼更新res陣列:

//res[i] = math.max(res[i],res[j]+1);

int[

] res =

newint

[envelopes.length]

;for

(int i = envelopes.length-

1;i>=

0;i--)}

resnum = math.

max(resnum,res[i]);

}return resnum;

}

轉換為求最長遞增子串行問題

我們將寬度由小到大排序,同樣寬度的信封要求高度由大到小。

高度所組成的陣列,求最長的上公升子串行,其值就是信封的最大值。

個人的一些理解:假設高度所組成的陣列中有個高度h,如果它之前有乙個比h還小的高度h0,就可以吧子串行長度+1(信封問題中就表示可以把h0塞到h信封中)。因為h的寬度一定比h0大,這已經事先排序完成了。

public

intmaxenvelopes

(int

envelopes)}}

//對於排序完之後的高度h,求最長上公升子串行

int res =0;

int[

] dp =

newint

[envelopes.length]

;for

(int i =

0;i}//返回dp中的最大值即可

for(

int i:dp)

return res;

}

俄羅斯套娃信封問題

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

俄羅斯套娃信封問題

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

俄羅斯套娃信封問題

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