题目:354. 俄罗斯套娃信封问题 - 力扣(LeetCode)
先对所有信封排个序,w从小到大,如果w相同则h从大到小。可以证明从左往右遍历数组,如果h[j] > h[i] && i < j,则 i 可以放进 j 里。
现在问题就变成了求这个数组的最大递增子序列的长度。
排序和求最大递增子序列长度的复杂度都是O(n*log(n))。
bool myComp(vector<int>& a, vector<int>& b) {
if (a[0] < b[0]) {
return true;
}
if (a[0] > b[0]) {
return false;
}
if (a[1] > b[1]) {
return true;
}
if (a[1] < b[1]) {
return false;
}
return false;
}
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
sort(envelopes.begin(), envelopes.end(), myComp);
vector<int> tails;
int h, l, r, m, k;
for (int i = 0; i < envelopes.size(); i++) {
h = envelopes[i][1];
if (tails.empty() || h > tails[tails.size() - 1]) {
tails.push_back(h);
continue;
}
if (tails[0] > h) {
tails[0] = h;
continue;
}
l = 0;
r = tails.size() - 1;
k = -1;
while (l <= r) {
m = (l + r) / 2;
if (tails[m] < h) {
k = m;
l = m + 1;
} else {
r = m - 1;
}
}
if (tails[k + 1] > h) {
tails[k + 1] = h;
}
}
return tails.size();
}
};