思路:
1. 按宽度对envelops进行升序排列,对相同宽度的envelops按长度降序排列
2. 对重新排好序的envelops,求最长严格升序的envelops长度序列,返回序列长度。
代码:
class Solution {
public:
int maxEnvelopes(vector<pair<int, int>>& envelopes) {
sort(envelopes.begin(), envelopes.end(), cmp);
vector<int> dp;
for (int i = 0; i < envelopes.size(); ++i)
binarySearch(dp,envelopes[i].second);
return dp.size();
}
static bool cmp(pair<int, int>& a, pair<int, int>& b){
return (a.first == b.first) ?
(a.second > b.second) : (a.first < b.first);
}
void binarySearch(vector<int>& dp, int value){
int low = 0, high = dp.size() - 1;
while (low <= high){
int mid = (low + high) / 2;
if (dp[mid] < value)
low = mid + 1;
else if (dp[mid] > value)
high = mid -1;
else
return;
}
if (dp.size() > low)
dp[low] = value;
else
dp.push_back(value);
}
};