class Solution {
public int maxEnvelopes(int[][] envelopes) {
if(envelopes.length==0)
return 0;
for(int i=1;i<envelopes.length;i++)
{
int []temp=envelopes[i];
int j=i-1;
for(;j>=0&&envelopes[j][0]>temp[0];j--)
{
envelopes[j+1]=envelopes[j];
}
if(j<0)
envelopes[0]=temp;
else
envelopes[j+1]=temp;
}
int []dp=new int[envelopes.length];
dp[0]=1;
for(int i=1;i<envelopes.length;i++)
{
int []temp=envelopes[i];
int max=0;
for(int j=i-1;j>=0;j--)
{
if(envelopes[j][0]<temp[0]&&envelopes[j][1]<temp[1])
{
max=Math.max(max,dp[j]);
}
}
dp[i]=max+1;
}
Arrays.sort(dp);
return dp[envelopes.length-1];
}
}
class Solution {
public int maxEnvelopes(int[][] envelopes) {
if(envelopes == null || envelopes.length == 0) return 0;
Arrays.sort(envelopes, new Comparator<int[]>(){
@Override
public int compare(int[] arr1, int[] arr2){
if(arr1[0] == arr2[0]){
return arr2[1] - arr1[1];
} else{
return arr1[0] - arr2[0];
}
}
});
int[] dp = new int[envelopes.length]; // the tail nums of length i;
int len = 0;
for(int[] envelope: envelopes){
int index = Arrays.binarySearch(dp, 0, len, envelope[1]);
if(index < 0){ // do not contain this num, adding to tail
index = -(index + 1); // replace it with smaller one
}
dp[index] = envelope[1];
if(index == len) len++;
}
return len;
}
}