其他分享
首页 > 其他分享> > 2022-4-20 二分查找

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