LeetCode 354 俄羅斯套娃信封問題

2022-09-21 02:39:09 字數 2168 閱讀 6596

354. 俄羅斯套娃信封問題

給你乙個二維整數陣列envelopes,其中envelopes[i] = [wi, hi],表示第i個信封的寬度和高度。

當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。

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

注意:不允許旋轉信封。

示例 1:

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

輸出:3

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

示例 2:

輸入:envelopes = [[1,1],[1,1],[1,1]]

輸出:1

本題其實是二維的【最長遞增子串行】問題,因為乙個信封要想套另乙個信封,那麼外層的信封長和寬均需要嚴格大於內層信封。

假設信封是由 (w, h) 這樣的二維數對形式表示的,思路如下:先對寬度 w 進行公升序排序,如果遇到 w 相同的情況,則按照高度 h 降序排序。之後把所有的 h 作為乙個陣列,在這個陣列上計算 lis 的長度就是答案。

畫個圖理解一下,先對這些數對進行排序:

然後在 h 上尋找最長遞增子串行:

class solution else

});// dp[i]表示以i結尾的子陣列的最長遞增子串行

int dp = new int[n];

int maxs = 1;

for(int i=0; ienvelopes[j][1])

}maxs = math.max(maxs, dp[i]);

}return maxs;}}

第一種方法的時間複雜度是\(o(n^2)\),對於本題的資料量來說必定會超時,所以需要一種更優的解法。

這個解法的時間複雜度為 o(nlogn),但是說實話,正常人基本想不到這種解法(也許玩過某些紙牌遊戲的人可以想出來)。所以大家了解一下就好,正常情況下能夠給出動態規劃解法就已經很不錯了。

根據題目的意思,我都很難想象這個問題竟然能和二分查詢扯上關係。其實最長遞增子串行和一種叫做 patience game 的紙牌遊戲有關,甚至有一種排序方法就叫做 patience sorting(耐心排序)。

為了簡單起見,後文跳過所有數學證明,通過乙個簡化的例子來理解一下演算法思路。

首先,給你一排撲克牌,我們像遍歷陣列那樣從左到右一張一張處理這些撲克牌,最終要把這些牌分成若干堆。

處理這些撲克牌要遵循以下規則

只能把點數小的牌壓到點數比它大的牌上;如果當前牌點數較大沒有可以放置的堆,則新建乙個堆,把這張牌放進去;如果當前牌有多個堆可供選擇,則選擇最左邊的那一堆放置。

比如說上述的撲克牌最終會被分成這樣 5 堆(我們認為紙牌 a 的牌面是最大的,紙牌 2 的牌面是最小的)。

為什麼遇到多個可選擇堆的時候要放到最左邊的堆上呢?因為這樣可以保證牌堆頂的牌有序(2, 4, 7, 8, q),證明略。

按照上述規則執行,可以算出最長遞增子串行,牌的堆數就是最長遞增子串行的長度,證明略。

我們只要把處理撲克牌的過程程式設計寫出來即可。每次處理一張撲克牌不是要找乙個合適的牌堆頂來放嗎,牌堆頂的牌不是有序嗎,這就能用到二分查詢了:用二分查詢來搜尋當前牌應放置的位置。

ps:舊文 二分查詢演算法詳解詳細介紹了二分查詢的細節及變體,這裡就完美應用上了,如果沒讀過強烈建議閱讀。

public int lengthoflis(int nums)  else if (top[mid] < poker)  else 

}if (left == piles) piles++;

top[left] = poker;

}return piles;

}

至此,二分查詢的解法也講解完畢。

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

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

leetcode 354 俄羅斯套娃信封問題

目錄 一 題目內容 二 解題思路 三 給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明...

Leetcode 354 俄羅斯套娃信封問題

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