354. 俄羅斯套娃信封問題
阿新 • • 發佈:2018-11-12
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; } }