最長上公升子串行nlogn演算法

2021-06-27 08:48:40 字數 524 閱讀 5609

定義d[k]:長度為k的上公升子串行的最末元素,若有多個長度為k的上公升子串行,則記錄最小的那個最末元素。

注意d中元素是單調遞增的,下面要用到這個性質。

首先len = 1,d[1] = a[1],然後對a[i]:若a[i]>d[len],那麼len++,d[len] = a[i];

否則,我們要從d[1]到d[len-1]中找到乙個j,滿足d[j-1]

最終答案就是len

利用d的單調性,在查詢j的時候可以二分查詢,從而時間複雜度為nlogn。

/* o(nlogn) solution */

/* * 二分查詢求大於等於x的下界

* 這裡陣列a是從下標1開始的

*/int binary_search(int *a, int n, int x)

return left;

}unsigned int lis2(int a, int n)

else

} return len;

}

最長上公升子串行nlogn演算法

這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行 或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 a.o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來...

最長上公升子串行nlogn演算法

這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行 或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 a.o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來...

最長上公升子串行nlogn演算法

剛才用o n 2 的dp演算法做了最長上公升子串行,具體見poj2533解題報告。後來在網上看到說lis問題有o nlogn 的演算法,於是拿來小研究了一下。這個演算法其實已經不是dp了,有點像貪心。至於複雜度降低其實是因為這個演算法裡面用到了二分搜尋。本來有n個數要處理是o n 每次計算要查詢n次...