乙個陣列求其最長遞增子串行(lis)
例如陣列的lis是,長度為5,假設陣列長度為n,求陣列的lis的長度,
需要乙個額外的陣列 lis 來記錄
長度從1 到 n 慢慢變長求解的過程中 對應長度的 最長遞增子串行的最小的末尾元素
解決方法
長度為1時 :
將3放入lis中,表示長度為1的時候,陣列的最長遞增子串行的最小微元素
lis:
只有乙個元素,所以 最長遞增子串行就是 ,最長遞增子串行的最小尾元素 就是3
長度為2時 :
新加入的元素1<3 長度增加變成2時,新加入的元素1比長度為1的時候的 最長遞增子串行的最小尾元素還小,所以新加入元素1不會引起最長遞增子串行變長,所以需要將1 插入 lis中,在lis中找到最小的比1大的元素,替換該元素,完成長度為2 的時候 最長遞增子串行的尋找,
lis:
1替換掉3 表示 在長度為2的時候的最長遞增子串行的最小尾元素是1,驗證 最長遞增子串行或
長度為3時 :
新加入的元素4>1,新加入的元素,比長度為2時的最長遞增序列的最小尾元素大,說明新加入元素可以引起最長遞增序列的增長,加入新元素4得:
lis:
驗證 最長遞增序列 或者
長度為4時 :
新加入元素2<4, 比長度為3時的最長遞增子串行的最小尾元素小,說明不引起最長遞增序列的增長,需要在lis中找到替換的元素 找到第乙個比2大的元素4替換,這樣在保證遞增序列數量不變的情況下,將遞增序列的範圍往小值方向移動。得
lis:
驗證 最長遞增序列 或者
長度為5時 :
新加入元素3>2, 比長度為4時的最長遞增子串行的最小尾元素大,說明引起最長遞增序列的增長,得
lis:
驗證 最長遞增序列
長度為6時 :
新加入元素9>3, 比長度為5時的最長遞增子串行的最小尾元素大,說明引起最長遞增序列的增長,得
lis:
驗證 最長遞增序列
長度為7時 :
新加入元素4<9, 比長度為3時的最長遞增子串行的最小尾元素小,說明不引起最長遞增序列的增長,需要在lis中找到替換的元素 找到第乙個比4大的元素9替換,這樣在保證遞增序列數量不變的情況下,將增序列的範圍往小值方向移動。得
lis:
驗證 最長遞增序列
長度為8時 :
新加入元素6>4, 比長度為7時的最長遞增子串行的最小尾元素大,說明引起最長遞增序列的增長,得
lis:
驗證 最長遞增序列
需要注意:
lis儲存的是 求解的過程中 對應長度的 最長遞增子串行的最小的末尾元素 不一定就是最長遞增序列原來的序列
插入新元素尋找替換位置的時候 有序查詢可以使用二分查詢 時間複雜度 o(logn)
所以該解決方法的時間複雜度nlogn
空間複雜度 n
最長遞增子串行個數
example 1 陣列 1,3,5,4,7 最長遞增子串行有 1,3,5,7 與 1,3,4,7 兩個長度為4的陣列 example 2 陣列 2,2,2,2,3 最長遞增子串行為 2,3 有4個 使用dp演算法,給定陣列 nums 最長遞增子串行長度 l i max l j 1 if nums ...
陣列最長遞增子串行
這個問題和矩陣相乘比較相似,但因為它只需要計算a 1.j 的代價,因此比矩陣相乘少了一層迴圈,矩陣相稱的複雜度是n的3次方,這個問題的複雜度是n平方的。要把資料列印出來,破費了一點周折,需要好好理解,其中遞迴退出的條件是,陣列記錄的位置和自身的位置相同,但這個位置的資料也要輸出,因此在else語句中...
陣列中最長遞增子串行
陣列是亂序的,如1,1,2,3,4,5,6,7 根據無後效性定義,陣列中當前元素所形成的子串行與其前面元素形成的子串行沒有關係,所以 lis i 1 max 1,lis k 1 其中,array i 1 arry k 且任意k i lis i 儲存對於當前陣列arry i 形成的最長子序列的長度值,...