题目链接:https://leetcode.com/problems/russian-doll-envelopes/
You have a number of envelopes with widths and heights given as a pair of integers (w, h)
. One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope.
What is the maximum number of envelopes can you Russian doll? (put one inside other)
Example:
Given envelopes = [[5,4],[6,4],[6,7],[2,3]]
, the maximum number of envelopes you can Russian doll is 3
([2,3] => [5,4] => [6,7]).
思路:一个最长升序子串的变形,先对数组以width进行升序排序,如果width相等就以height降序排序.因为这样可以保证依次遍历数组的时候后面的width始终比前面的大并且如果高度也大于前面的就一定可以包含前面的.如果不对height降序排列形如[6,4], [6,7]前面是不能包含后面一个的.
代码如下:
class Solution {
public:
int maxEnvelopes(vector<pair<int, int>>& envelopes) {
auto cmp = [](pair<int, int> a, pair<int, int> b)
{ return a.first==b.first?a.second>b.second:a.first<b.first; };
sort(envelopes.begin(), envelopes.end(), cmp);
vector<int> dp;
for(auto val: envelopes)
{
if(dp.size()==0 || val.second>dp.back()) dp.push_back(val.second);
else
{
int left = 0, right = dp.size()-1;
while(left <= right)
{
int mid = (left+right)/2;
if(dp[mid] < val.second) left = mid+1;
else right = mid-1;
}
dp[left] = val.second;
}
}
return dp.size();
}
};
参考:https://leetcode.com/discuss/106946/java-nlogn-solution-with-explanation