第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS問題
阿新 • • 發佈:2017-05-14
新的 gin 不能 size rip 二維 lis nlog ==
Leetcode354 暴力的方法是顯而易見的 O(n^2)構造一個DAG找最長鏈即可。
也有辦法優化到O(nlogn)
註意 信封的方向是不能轉換的。
對第一維從小到大排序,第一維相同第二維從大到小排序。
維護一個符合題意的隊列,當隊列中的第二維均比當前信封的第二維小時,必然可以增加到隊尾。
如果不然,可以讓當前信封作為“替補”,它可以在恰當的時候代替恰好比它大的信封。
當替補們足夠替換所有已有信封時,就可以增加新的信封了。
比較抽象,不過這個技巧很有趣。
看代碼吧,很清晰。
class Solution { public: static bool cmp_first(const pair<int, int>& i, const pair<int, int>& j) { if (i.first == j.first) return i.second > j.second; return i.first < j.first; } int maxEnvelopes(vector<pair<int, int>>& envelopes) { sort(envelopes.begin(), envelopes.end(), cmp_first); vector<int> dp; for (int i = 0; i < envelopes.size(); ++i) { auto itr = lower_bound(dp.begin(), dp.end(), envelopes[i].second); if (itr == dp.end()) { dp.push_back(envelopes[i].second); } else { *itr = envelopes[i].second; } } return dp.size(); } };
第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS問題