通常的解法是O(n*n)的,但其实有O(nlgn)的解法,写起来也很简单(注:只求长度)
如下:
set<int> st;
set<int>::iterator it;
st.clear();
for(int i = 0; i < n; ++i) {
st.insert(arr[i]);
it = st.find(arr[i]);
++it;
if(it != st.end()) st.erase(it);
}
cout << st.size() << endl;
注:上面的方法和在维基百科看到的方法(http://en.wikipedia.org/wiki/Longest_increasing_subsequence)原理其实是一样的,只是借助了stl中set是有序二叉树的性质,避免了自己写二分查找和数组维护。