Russian Doll Envelopes
阿新 • • 發佈:2018-12-20
解法一 DP O(n^2)
class Solution { public: int maxEnvelopes(vector<pair<int, int>>& envelopes) { sort(envelopes.begin(), envelopes.end()); int n = envelopes.size(); int res = 0; vector<int> dp(n, 1); for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ if(envelopes[j].first<envelopes[i].first && envelopes[j].second<envelopes[i].second) dp[i] = max(dp[i], dp[j]+1); } res = max(res, dp[i]); } return res; } };
解法二 Binary Search O(n logn)
從小到大排序寬,從大到小排高,然後此題就變成求高的Longest Increasing Subsequence
Why? 我們需要寬高分別從大到小並且不包括相等的情況。寬已經符合條件除了相等的時候,但是把高從大到小排之後就避免了這種情況。
class Solution { public: int maxEnvelopes(vector<pair<int, int>>& envelopes) { sort(envelopes.begin(), envelopes.end(), [](const pair<int,int> &a, const pair<int,int> &b){ return a.first<b.first || (a.first==b.first && a.second>b.second); }); int n = envelopes.size(); vector<int> dp; for(int i=0;i<n;i++){ int t = envelopes[i].second; int l=0, r=dp.size(); while(l<r){ int mid = l+(r-l)/2; if(t>dp[mid]) l=mid+1; else r=mid; } if(r==dp.size()) dp.push_back(t); else dp[r] = t; } return dp.size(); } };