算法原理很简单,不再赘述,这里贴一个函数模板,传入的参数为序列首尾元素的指针。
template<typename T> int LIS_nlogn(T * s, T * e) { if(s > e) return 0; T g[e - s + 5]; int ret = 0; memset(g, 0, sizeof(g)); for(T * i = s; i <= e; i++) { if(g[ret] < (*i)) { g[++ret] = (*i); continue; } int l = 1, r = ret, mid; while(1) { mid = (l + r) >> 1; if((*i) < g[mid]) r = mid; else l = mid; if(l == r || l + 1 == r) break; } g[l] = (*i); } return ret; }