俄罗斯套娃信封
作者:互联网
给一定数量的信封,带有整数对 (w, h)
分别代表信封宽度和高度。一个信封的宽高均大于另一个信封时可以放下另一个信封。
求最大的信封嵌套层数。
样例
样例 1:
输入:[[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:
最大的信封嵌套层数是 3 ([2,3] => [5,4] => [6,7])。
样例 2:
输入:[[4,5],[4,6],[6,7],[2,3],[1,1]]
输出:4
解释:
最大的信封嵌套层数是 4 ([1,1] => [2,3] => [4,5] / [4,6] => [6,7])。
bool mycmp(pair<int, int>& A, pair<int, int>& B)
{
if(A.first < B.first)
{
return true;
}
else if(A.first > B.first)
{
return false;
}
if(A.second > B.second)
{
return true;
}
return false;
}
void myprint(pair<int, int>& A)
{
cout<<A.first<<" "<<A.second<<endl;
}
class Solution {
public:
/*
* @param envelopes: a number of envelopes with widths and heights
* @return: the maximum number of envelopes
*/
int maxEnvelopes(vector<pair<int, int>>& envelopes) {
// write your code here
sort(envelopes.begin(), envelopes.end(), mycmp);
//for_each(envelopes.begin(), envelopes.end(), myprint);
vector<int> nums;
for(int i = 0; i < envelopes.size(); i++)
{
nums.push_back(envelopes[i].second);
}
return longestIncreasingSubsequence(nums);
}
int longestIncreasingSubsequence(vector<int> &nums)
{
// write your code here
int size = nums.size();
int res = 0;
int top[size];
int piles = 0;
for(int i = 0; i < size; i++)
{
int poker = nums[i];
int left = 0;
int right = piles;
while(left < right)
{
int mid = (left + right) / 2;
if(top[mid] >= poker)
{
right = mid;
}
else
{
left = mid + 1;
}
}
if(left == piles)
piles++;
top[left] = poker;
}
return piles;
}
};
标签:信封,return,nums,int,envelopes,套娃,俄罗斯,left 来源: https://blog.csdn.net/weixin_41791402/article/details/100062636