算法笔记之最大递增子序列问题(俄国沙皇问题)
1.给定一个N*2的二位数组,看作是一个个二元组,例如[[a1,b1],[a2,b2],[a3],[b3]],规定:一个如果想把二元组甲放在二元组乙上,甲中的a值必须大于已中的a值,甲中的b值必须大于乙中的b值。如果在二维数组中随意选择二元组,请问二元组最多可以放在几层?
例如:[[5,4],[6,4],[6,7],[2,3]],最多的数量可以放3层,[2,3]=>[5,4]=>[6,7]
要求:实现时间复杂度O(N*logN)的解法
解析:
算法原型:最大递增子序列问题:2.1.6.4.5.2.7.4 最长递增子序列为 1.4.5.7 不能打乱顺序、长度最长
O(n^2):生成辅助数组h[i]与原数组一样长、h[0]为只包含array[0]时最长递增子序列的长度、h[0]为1、h[1]为0、h[2]为[2]。。。。。就i这个位置的值就得枚举i之前所有的值
O(n*logn):生成辅助数组h[i]与原数组一样长、h[0]的位置将2拷贝进去、设h[0]为有效区,后面为无效区,在有效区中,当遇到1时,把2改写成1,则以1结尾的最长递增子序列长度为1,遇到6,找第一个大于6的数,没有找到,则有效区向右扩展一个位置
此时有效区为1,6.。接下来找4,发现有效区6比4大,则代替。有效区为2.遇到5,有效区右扩展,有效区为1,4,5.(往有效区填的过程是二分的)以此类推,以7结尾的最长递增子序列最大长度为4.,以4结尾的最大长度为3.用一个全局变量记录出现的最大值返回就行。
第二种方法h[i]的含义是指 遍历到当前时刻为止长度为i+1的最长递增子数组的最小末尾。
解题:先将a从小到大排序,在此基础上再将b从小到大排序 这样不能用O(n*logn)的二分查找方式加速!!
最优解:先按照a的值从小到大排序,然后在a的值一样的情况下b从大到小排序
生成辅助数组h[i],数组中不放二元组,数组中放二元组中b出现的值。然后按照上述原型方法2进行排序。
----来自牛客堂算法精讲直播讲座
秒哇!我懂了!
不好意思,接下来具体过程不说了,太妙了,已经妙到只能靠脑袋脑补接下来的过程了!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最后我还是没会!
也不会实现!
这还是第一题!
以后打死不做算法工程师!