题解
- w按照升序排序之后,对于h求LIS即可
- 注意排序时,w相同的,要按照h降序排序。这样可以防止w相同,求h的lis出现违法情况
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
sort(envelopes.begin(), envelopes.end(), [](const vector<int>& a, const vector<int>& b) {
if (a[0] != b[0]) return a[0] < b[0];
else return a[1] > b[1];
});
vector<int> b(envelopes.size() + 1, 0);
int len = 0;
for (vector<int>& env : envelopes) {
if (env[1] > b[len]) {
b[++len] = env[1];
}
else {
int low = 0, high = len;
while (low < high) {
int mid = low + (high - low) / 2;
if (env[1] <= b[mid]) high = mid;
else low = mid+1;
}
b[low] = env[1];
}
}
return len;
}
};
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
int n = envelopes.size();
sort(envelopes.begin(), envelopes.end(), [](const vector<int>& a, const vector<int>& b){
if(a[0] != b[0]) return a[0] < b[0];
else return a[1] > b[1];
});
vector<int> dp(n + 1);
int len = 0;
dp[1] = envelopes[0][1];
for(vector<int> e : envelopes) {
if(e[1] > dp[len]) {
dp[++len] = e[1];
}
else {
int p = lower_bound(dp.begin() + 1, dp.begin() + len + 1, e[1]) - dp.begin();
dp[p] = e[1];
}
}
return len;
}
};