Leetcode 354.俄罗斯套娃信封问题
俄罗斯套娃信封问题
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算最多能有多少个信封能组成一组"俄罗斯套娃"信封(即可以把一个信封放到另一个信封里面)。
说明:
不允许旋转信封。
示例:
输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出: 3
解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。
解题报告
先对宽度进行排序,再应用最长递增子序列的方法,寻找高度递增的最大长度
数组的最长递增子序列
 public void lis(float[] L) {
     int n = L.length;
     int[] f = new int[n];//用于存放f(i)值;
     f[0] = 1;//以第a1为末元素的最长递增子序列长度为1;
     for (int i = 1; i < n; i++)//循环n-1次
     {
         f[i] = 1;//f[i]的最小值为1;
         for (int j = 0; j < i; j++)//循环i 次
         {
             if (L[j] < L[i] && f[j] > f[i] - 1)
                 f[i] = f[j] + 1;//更新f[i]的值。
         }
     }
 }
这个算法有两层循环,外层循环次数为n-1次,内层循环次数为i次,算法的时间复杂度
所以T(n)=O(n2)。
在计算每一个f(i)时,都要找出最大的f(j)(j<i)来,由于f(j)没有顺序,只能顺序查找满足aj<ai最大的f(j),如果能将让f(j)有序,就可以使用二分查找,这样算法的时间复杂度就可能降到O(nlogn)。于是想到用一个数组B来存储"子序列的"最大递增子序列的最末元素,即有
B[f(j)] = aj
在计算f(i)时,在数组B中用二分查找法找到满足j<i且B[f(j)]=aj<ai的最大的j,并将B[f[j]+1]置为ai。
 public void lis1(float[] L) {
     int n = L.length;
     float[] B = new float[n+1];//数组B;
     B[0]=-10000;//把B[0]设为最小,假设任何输入都大于-10000;
     B[1]=L[0];//初始时,最大递增子序列长度为1的最末元素为a1
     int Len = 1;//Len为当前最大递增子序列长度,初始化为1;
     int p,r,m;//p,r,m分别为二分查找的上界,下界和中点;
     for(int i = 1;i<n;i++)        {
         p=0;r=Len;
         while(p<=r)//二分查找最末元素小于ai+1的长度最大的最大递增子序列;
         {
             m = (p+r)/2;
             if(B[m]<L[i]) p = m+1;
             else r = m-1;
         }
         B[p] = L[i];//将长度为p的最大递增子序列的当前最末元素置为ai+1;
         if(p>Len) Len++;//更新当前最大递增子序列长度;
     }
 }



 public class Solution {
     public int maxEnvelopes(int[][] envelopes) {
         Arrays.sort(envelopes, new Comparator<int[]>() {
             @Override
             public int compare(int[] e1, int[] e2) {
                 if (e1[0] != e2[0]) return e1[0] - e2[0];
                 return e2[1] - e1[1];
             }
         });
         int len = 0;
         int[] h = new int[envelopes.length];
         for(int[] envelope : envelopes) {
             int i=0, j=len-1;
             while (i<=j) {
                 int m = (i+j)/2;
                 if (h[m] < envelope[1]) i=m+1; else j=m-1;
             }
             h[i] = envelope[1];
             if (i == len) len ++;
         }
         return len;
     }
 }
 
Leetcode 354.俄罗斯套娃信封问题的更多相关文章
- Java实现 LeetCode 354 俄罗斯套娃信封问题
		
354. 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一 ...
 - leetcode 354. 俄罗斯套娃信封问题(二维排序有关)
		
题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...
 - 1、线性DP  354. 俄罗斯套娃信封问题
		
354. 俄罗斯套娃信封问题 https://leetcode-cn.com/problems/russian-doll-envelopes/ 算法分析 首先我们从两种情况来讨论这个问题: w无重复值 ...
 - [Swift]LeetCode354. 俄罗斯套娃信封问题 | Russian Doll Envelopes
		
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...
 - [LeetCode] 354. Russian Doll Envelopes 俄罗斯套娃信封
		
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...
 - leetCode 354. Russian Doll Envelopes
		
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...
 - leetcode@ [354] Russian Doll Envelopes (Dynamic Programming)
		
https://leetcode.com/problems/russian-doll-envelopes/ You have a number of envelopes with widths and ...
 - 第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS问题
		
Leetcode354 暴力的方法是显而易见的 O(n^2)构造一个DAG找最长链即可. 也有办法优化到O(nlogn) 注意 信封的方向是不能转换的. 对第一维从小到大排序,第一维相同第二维从大到小 ...
 - Swift LeetCode 目录 | Catalog
		
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
 
随机推荐
- arcengine,c# 二次开发
			
plication.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ESRI.ArcGIS.Ru ...
 - 接口文档管理工具rap
			
git地址: https://github.com/thx/RAP wiki : https://github.com/thx/RAP/wiki/home_cn 视频教程: http://thx.g ...
 - oracle 换行回车符
			
工作中碰到这样一种情况,做一个data patch,将表中的某个字段的内容copy到另一个字段,添加时若目标字段有值,需要换行处理. 首先,oracle中的回车符是chr(13),换行符是chr(10 ...
 - ES-windos环境搭建(1)
			
前言 由于elasticsearch为Java开发,所以它还依赖Java JDK环境,并且对版本还有要求,需要1.8(含)以上.我们首先来配置Java JDK环境. JDK简介 JDK是Java语言的 ...
 - node.js之Windows 系统下设置Nodejs NPM全局路径
			
node.js 0.10 版本下修改全局路径: npm config set cache "D:\nodejs\node_cache" npm config set prefix ...
 - php通过类名查找这个类所在的路径(即实际引用的是哪个类)
			
实际上就是应用了类的反射机制 class a{ public $a; protected $b; private $c; } $func = new ReflectionClass('a'); //所 ...
 - Alpha-beta pruning
			
function alphabeta(node, depth, α, β, maximizingPlayer) or node is a terminal node return the heuris ...
 - SAP成都研究院飞机哥:程序猿和飞机的不解之缘
			
今天的文章来自Jerry的老同事张航. 张航和Jerry一样于2007年毕业后加入SAP成都研究院工作至今.进入SAP后的第一个开发部门是SAP Business by Design Infrastr ...
 - Easier Done Than Said?(应用到的知识)
			
memset(b,0,sizeof(b)) 对于大块儿内存的分配,例如int arr[100];定义了数组arr,包含100个元素,如果你写成int arr[100]=0;想将数组全部内容初始化为0, ...
 - sql server 处理分母为空
			
SP 前面加下面设置,会忽略错误结果 直接返回null 不会导致SP 失败 SET ANSI_WARNINGS OFFSET ARITHABORT OFFSET ARITHIGNORE ON