题目
有多个大小形状不同的信封,你知道每个信封的长和宽,现在你想把相对小的信封塞进大信封里面,给出能套最多个信封的算法。
解答
先把信封的长进行升序排序,再把长对应的宽中,找到最长上升子序列(Longest Increasing Subsequence)的长度。
排序
时间复杂度为O(nlogn)的排序算法,最常用的有快速排序和归并排序。
快速排序代码:
归并排序代码:
最长上升子序列
这是动态规划的思路。算法迭代步骤:
-
L [ i ] L[i] L[i]表示当上升子序列数为 i i i时,该子序列的结尾能取到的最小数。
-
用二分查找找到第 j j j个数在 L L L中所对应的排序位置 r r r, r r r便是以第 j j j个数为结尾时的上升子序列数。
-
更新 L L L,若 r > l e n g t h ( L ) r>length(L) r>length(L),则在 L L L后加进这个数;若不然,则替换 L [ r − 1 ] L[r-1] L[r−1]为这个数。
-
遍历完所有数后, l e n g t h ( L ) length(L) length(L)便是最长上升子序列数。
LIS代码: