const arr = [2, 1, 5, 3, 6, 4, 8, 9, 7]
function getsequence (arr)
u = 0 // result陣列第0個元素
v = result.length - 1 // result陣列的最後乙個元素
// 二分搜尋,查詢比 arri 小的節點,更新 result 的值
while (u < v) else
} // 最後的結果是找到u元素
if (arri < arr[result[u]])
result[u] = i}}
}u = result.length
v = result[u - 1]
// 回溯陣列 p,找到最終的索引
while (u-- > 0)
return result // 1 3 5 6 7
}console.log(
// getsequence([5,3,4,0])
getsequence([2, 1, 5, 3, 6, 4, 8, 9, 7])
);/*
。對於我們的例子而言,[2, 1, 5, 3, 6, 4, 8, 9, 7] 的最長子序列是 [1, 3, 4, 8, 9],
而我們求解的 [1, 3 ,5 ,6 ,7] 就是最長子序列中元素在原陣列中的下標所構成的新陣列。
*/// 2, 1, 5, 3, 6, 4, 8, 9, 7
//i//1步 2
//2步 1
//3步 1 5 p[2] =1 result:[1,2]
//4步 1 3 p[3] =1 result:[1,3] 更新index為3這個位置的元素的時候,前乙個比他小的元素index是1
//5步 1 3 6 p[4] =3 result:[1,3,4]
//6步 1 3 4 p[5] =3 result:[1,3,5] 更新index為5這個位置的元素的時候,前乙個比他小的元素index是3
//7步 1 3 4 8 p[6] =5 result:[1,3,5,6] 更新index為6這個位置的元素的時候,前乙個比他小的元素index是5
//8步 1 3 4 8 9 p[7] =6 result:[1,3,5,6,7] 更新index為7這個位置的元素的時候,前乙個比他小的元素index是6
//9步 1 3 4 7 9 p[8] =5 result:[1,3,5,8,7]
// 操作結束後,result中的最後乙個元素一定是最大子串行的最後乙個元素,
// 但是前面的值不一定正確,比如第9步的時候7將8替換掉了,已經不滿足子串行的條件了
// 所以需要陣列p來記錄 陣列p中記錄了第i次操作的時候,這次將要替換的元素的前乙個元素(比它小的那個元素) 的index
// 最後進行乙個回溯的操作
// 從result的最後乙個元素開始,result中最後乙個元素7肯定對應著最大子串行的最後乙個,
// 去p陣列中找,p陣列中對應的這個元素,記錄了更新index為7的時候的前乙個比他小的元素的index
// 向前回溯去找
最長遞增子串
第一類 只需要求長度最長的遞增子串 方法1 時間複雜度 o n 2 include include define maxn 1000 5 using namespace std inta maxn b maxn a i 表示輸入的陣列,b i 表示到字元 i的最長遞增子串 intmain for i...
動態規劃 最長遞增子串行和最長連續遞增子串行
leetcode 674.最長連續遞增序列 題目描述 給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。連續遞增的子串行 可以由兩個下標 l 和 r l r 確定,如果對於每個 l i r,都有 nums i nums i 1 那麼子串行 nums l nums l 1 ...
字母排序(最長遞增子串)
x年突然有外星人造訪,但大家語言不通,不過科學家們經過研究發現外星人用26個英文本母組成的單詞中最長不降子串行的長度來表述數字,且英文本母的排列順序不同,現給出其排列順序,再給出外星人說的每個數字 其實是每個英文單詞,用空格隔開 翻譯出外星人所說的數字 連續輸出,最後加回車 因為是最長不降子串行,所...