一個數組求其最長遞增子序列(LIS)數組
例如數組{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},長度爲5,假設數組長度爲N,求數組的LIS的長度,方法
須要一個額外的數組 LIS 來記錄移動
長度從1 到 n 慢慢變長求解的過程當中 對應長度的 最長遞增子序列的最小的末尾元素時間
解決方法
長度爲1時 {3}:
將3放入LIS中,表示長度爲1的時候,{3}數組的最長遞增子序列的最小微元素
LIS:{3}
只有一個元素,因此 最長遞增子序列就是 {3},最長遞增子序列的最小尾元素 就是3
長度爲2時 {3,1}:
新加入的元素1<3 長度增長變成2時,新加入的元素1比長度爲1的時候的 最長遞增子序列的最小尾元素還小,因此新加入元素1不會引發最長遞增子序列變長,因此須要將1 插入 LIS中,在LIS中找到最小的比1大的元素,替換該元素,完成長度爲2 的時候 最長遞增子序列的尋找,
LIS:{1}
1替換掉3 表示 在長度爲2的時候{3,1}的最長遞增子序列的最小尾元素是1,驗證 最長遞增子序列{1}或{3}
長度爲3時 {3,1,4}:
新加入的元素4>1,新加入的元素,比長度爲2時的最長遞增序列的最小尾元素大,說明新加入元素能夠引發最長遞增序列的增加,加入新元素4得:
LIS:{1,4}
驗證 最長遞增序列 {3,4} 或者 {1,4}
長度爲4時 {3,1,4,2}:
新加入元素2<4, 比長度爲3時的最長遞增子序列的最小尾元素小,說明不引發最長遞增序列的增加,須要在LIS中找到替換的元素 找到第一個比2大的元素4替換,這樣在保證遞增序列數量不變的狀況下,將遞增序列的範圍往小值方向移動。得
LIS:{1,2}
驗證 最長遞增序列 {3,4} 或者 {1,2}
長度爲5時 {3,1,4,2,3}:
新加入元素3>2, 比長度爲4時的最長遞增子序列的最小尾元素大,說明引發最長遞增序列的增加,得
LIS:{1,2,3}
驗證 最長遞增序列 {1,2,3}
長度爲6時 {3,1,4,2,3,9}:
新加入元素9>3, 比長度爲5時的最長遞增子序列的最小尾元素大,說明引發最長遞增序列的增加,得
LIS:{1,2,3,9}
驗證 最長遞增序列 {1,2,3,9}
長度爲7時 {3,1,4,2,3,9,4}:
新加入元素4<9, 比長度爲3時的最長遞增子序列的最小尾元素小,說明不引發最長遞增序列的增加,須要在LIS中找到替換的元素 找到第一個比4大的元素9替換,這樣在保證遞增序列數量不變的狀況下,將增序列的範圍往小值方向移動。得
LIS:{1,2,3,4}
驗證 最長遞增序列 {1,2,3,4}
長度爲8時 {3,1,4,2,3,9,4,6}:
新加入元素6>4, 比長度爲7時的最長遞增子序列的最小尾元素大,說明引發最長遞增序列的增加,得
LIS:{1,2,3,4,6}
驗證 最長遞增序列 {1,2,3,4,6}
須要注意:
LIS保存的是 求解的過程當中 對應長度的 最長遞增子序列的最小的末尾元素 不必定就是最長遞增序列原來的序列
插入新元素尋找替換位置的時候 有序查找能夠使用二分查找 時間複雜度 o(LogN)
因此該解決方法的時間複雜度NlogN
空間複雜度 N