二分求最長上公升子串行

2021-09-10 21:43:36 字數 1421 閱讀 8466

二分求最長上公升子串行(求長度)

之前在書上其實見到過,但是沒想去看,結果…

回到正題,二分求最長上公升子串行的思路是,在原動態規劃寫法上進行優化,優化了查詢過程,使得查詢過程變成了lon2n,然後還用到了貪心,怎麼貪,就是保證原序列長度不變的情況下,讓裡面的元素盡可能小(當然滿足遞增),下面來驗證為什麼是這樣是正確的。

資料:1 5 9 2 3 4

下標:1 2 3 4 5 6

最長上公升子串行

輔助陣列                         長度                             第幾次操作    

1                                 1                                        1

1 5                              1                                        2

1 5 9                           3                                        3

1 2 9                           3                                        4                         (說明:是不是覺得很奇怪,這個陣列並不對。)

1 2 3                           3                                        5

1 2 3 4                        4                                        6                           (結果:這個陣列就是最長的上公升子串行。)

思路:就像上面那樣變化,(這是乙個貪心)。變換過程中,得到的上公升陣列可能不是正確的,但是如果長度發生變化,就得到了一次正確的「最長上公升子串行」。最後一次變化就是最長的上公升子串行。(好好想,這是重點!)

實現:在原陣列中遍歷,如果當前的數a比輔助陣列中的最後乙個數還大,那就直接插入,如果比最後乙個數小(這裡注意了,不是相等)進行替換操作。

替換操作的原則是,從輔助陣列中第乙個數開始找,替換輔助陣列中第乙個大於a的數。(這一過程加入二分,就變成了二分求最長上公升子串行)

實現的話倒是不難,乙個陣列存輸入陣列,乙個陣列模擬以上過程,再寫個二分就完事了。

**:

class solution 

else

} return temp;

} //最長上公升子串行

public int lengthoflis(int nums)

else

}return index + 1;

}return 0;

}}

二分求最長上公升子串行

我們知道n2 求最長上公升子串行的方法,即 f i m ax f i f j 1 j 1i 1,f i f j 然而,我們可以用二分求最長上公升子串行。由於我們知道子串行c,c 1 c 2 c n 所以我們二分出乙個位置t,將c t 的值更新為a i 如果t ans,證明最長上公升子串行的長度可以 ...

最長上公升子串行(貪心 二分)

最長上公升子串行的求法,除了最樸素的動態規劃外,還有利用貪心和二分法進行求解,其時間複雜度為o nlogn 低於動態規劃的時間複雜度o n2 在藍橋杯這種測試樣例巨大的競賽中,使用貪心 二分法可以有效避免超時 對於乙個數列a 我們定義乙個陣列s和陣列b,陣列b用來儲存可能的上公升序列。s i 表示長...

求最長上公升子串行

q 有乙個長為n的數列a0,a1,an 1。求出這個序列中最長的上公升子串行的長度。上公升子串行指的是對於任意的i大致思路是這樣的,初始設定乙個最大長度maxlength為0,從數列的第一項開始遍歷,只要當前項大於前一項則加入,否則繼續遍歷,直至此次遍歷結束。然後與maxlength做對比,如果大於...