二分优化版本
tail[i]表示的是长度为i+1的上升子序列的末尾的最小值,
如果当前tail数组的长度为m,说明此时上升子序列的长度最长就是m,
如果此时遍历到num,此时tail的长度为m,最长上升子序列的长度想变长,
num就必须大于tail最后一个数。
因为tail里存的是最小值,如果num都没有最小值大,肯定不能接在任何长度为m的上升子序列的后面。
这种情况(num没有tail的最后一个数大)我们就通过二分找到tail中第一个大于等于num的数(肯定存在,因为至
少tail的最后一个数一定满足),找到后更新tail,将这个数更新为num。
为什么能更新?
因为我们找到是第一个大于等于num的数,这个数前面的数一定是小于num的,也就是说num可以接在这个小于num的
数的后面,从而成为一个长度+1的上升子序列,这个序列的末尾是num,而num又小于当前tail数组中对应长度的数
,所以需要更新。