2022-4-20 二分查找
作者:互联网
354. 俄罗斯套娃信封问题
给你一个二维整数数组 envelopes
,其中 envelopes[i] = [wi, hi]
,表示第 i
个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
1 class Solution { 2 public int maxEnvelopes(int[][] envelopes) { 3 PriorityQueue<int[]> queue=new PriorityQueue<>( 4 new Comparator<int[]>(){ 5 @Override 6 public int compare(int[] a,int[] b){ 7 if (a[0]!=b[0]) return a[0]-b[0]; 8 else return b[1]-a[1]; 9 } 10 } 11 ); 12 for (int[] x:envelopes){ 13 queue.offer(x); 14 } 15 int n=envelopes.length; 16 int[] h=new int[n]; 17 int index=0; 18 while (!queue.isEmpty()) { 19 h[index]=queue.poll()[1]; 20 index++; 21 } 22 int piles=0; 23 int[] dp=new int[n]; 24 for (int i=0;i<n;i++){ 25 int pair=h[i]; 26 int left=0,right=piles; 27 while (left<right) { 28 int mid=(left+right)/2; 29 if (dp[mid]>=pair){ 30 right=mid; 31 }else{ 32 left=mid+1; 33 } 34 } 35 if (left==piles) piles++; 36 dp[left]=h[i]; 37 } 38 39 return piles; 40 } 41 }
思路:二维最长递增子序列可以通过优先排列的顺序转化为一维。方法为先按照第一个宽度从小到大排序,相同就按照高度从大到小排列。
转化为高度的最长递增子序列后,可以动态规划。
也可以利用耐心排序的方法。纸牌游戏 二分实现。
小的可以压在大的牌上面,否则开一个新的牌堆。
利用二分查找当前的牌放在哪里,或者新开牌堆。
最长的序列就是牌堆的数量。
标签:二分,信封,20,2022,piles,int,queue,envelopes,new 来源: https://www.cnblogs.com/benbicao/p/16169838.html