二维的最长递增子序列问题
先对信封的宽进行从小到大排序,宽度一样则按照高度从大到小排序
再对高度查找最长递增子序列即可
#include<vector>
using namespace std;
class Solution {
public:
// 普通排序,下面有快排
void so(vector<vector<int>>& envelopes){
int size = envelopes.size();
for(int i = 0;i < size-1; i++){
for(int j = 0;j < size-1-i;j++){
if(envelopes[j+1][0] < envelopes[j][0]){
int q = envelopes[j+1][0];
envelopes[j+1][0] = envelopes[j][0];
envelopes[j][0] = q;
q = envelopes[j+1][1];
envelopes[j+1][1] = envelopes[j][1];
envelopes[j][1] = q;
}
else if (envelopes[j+1][0] == envelopes[j][0])
{
if(envelopes[j+1][1] < envelopes[j][1]){
int q = envelopes[j+1][0];
envelopes[j+1][0] = envelopes[j][0];
envelopes[j][0] = q;
q = envelopes[j+1][1];
envelopes[j+1][1] = envelopes[j][1];
envelopes[j][1] = q;
}
}
}
}
return;
}
//快排
void quickSort(int l,int r, vector<vector<int>>& envelopes){
if(l >= r) return;
int _0 = envelopes[l][0];
int _1 = envelopes[l][1];
int i = l,j = r;
while(i < j){
while((envelopes[j][0] > _0 && i < j) || (envelopes[j][0] == _0 && i < j && envelopes[j][1] < _1)){
j--;
}
if(i < j){
envelopes[i][0] = envelopes[j][0];
envelopes[i][1] = envelopes[j][1];
i++;
}
while((envelopes[i][0] < _0 && i < j) || (envelopes[i][0] == _0 && i < j && envelopes[i][1] > _1)){
i++;
}
if(i < j){
envelopes[j][0] = envelopes[i][0];
envelopes[j][1] = envelopes[i][1];
j--;
}
}
envelopes[i][0] = _0;
envelopes[i][1] = _1;
quickSort(l,i-1,envelopes);
quickSort(i+1,r,envelopes);
}
int maxEnvelopes(vector<vector<int>>& envelopes){
int size = envelopes.size();
quickSort(0,size-1,envelopes);
// sort(envelopes.begin(),envelopes.end(),[](const vector<int>& a,const vector<int>& b){
// return a[0]<b[0]||(a[0]==b[0]&&a[1]>b[1]);
// });
int l[9999] = {0};
l[0] = 1;
for(int i = 1; i < size; i++){
int ma = 0;
for(int j = 0;j < i;j++){
if(ma < l[j] && envelopes[i][1] > envelopes[j][1]){
ma = l[j];
}
}
ma++;
l[i] = ma;
}
int m = 0;
for(int i = 0;i < size;i++){
if(m < l[i]){
m = l[i];
}
}
return m;
}
};
// [[1,3],[3,5],[6,7],[6,8],[8,4],[9,5]]