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