輸入:array整數陣列 eg:[3,2,4,5,1,3]
輸出:最長遞增子串行 eg:[2,4,5]
#複雜度big o(n^2)
加乙個ends陣列:
定義ends[i]:(下標0開始),找到所有長度為i+1的遞增子串行的最小結尾是啥
eg:array=[3,2,4,5,1,3]
array=[3
ends=[
dp= [
i=0時
array[0]=3
然後再ends中找最左大大於等於自己的(數字3),此時ends空,ens[0]=3,代表長度1的遞增子串行最小值就是自己3
ends[0]=3 #因為長度1的遞增子串行最小結尾 是數字3
然後dp[0]=1 #前面沒有數子比較,就只有自己乙個,長度1
array=[3,2
ends=[3,
dp= [1,
i=1時
array[1]=2
然後ends中找最左的大於自己的位置並更新:(二分查詢),找到數字3,下標0,改寫ends[0]=2,因為只有長度為1的3和當前自己了,找到的就是比自己大的,將其當前i+1長度遞增子串行結尾數字調小(因為長度i+1的長度遞增子串行結尾可以更新成自己的值,自己代替成為結尾,因為小於i+1長度遞增子串行結尾數字都是小於等於array[i]自己啊,更新沒問題)
ends[0]=2 #更新,這裡指數字2 (當前 arr[:i] [3,2]中 長度為1的最小結尾不就是2嗎?)
更新dp[1]=1 #因為自己替換的就是ends[0]這個位置,代表當前以自己結尾的最長遞增子串行,長度0+1=1
dp[1]=1
array=[3,2,4
ends=[2,
dp= [1,1
i=2時
array[2]=4 在 ends中比自己大的數字,沒找到,擴充位置,ends從最長遞增子串行長度1,可以到長度2了
ends=[2,4 #為什麼等於4,因為4沒找到啊,4就是當前最大的
dp=[1,1,2 #為什麼等於2,因為改的時ends的位置,代表4結尾最大長度遞增長度1+1=2
array=[3,2,4,5
ends=[2,4,
dp= [1,1,2
i=3時
array[3]=5 在 ends中比自己大的數字,沒找到,擴充位置,ends從最長遞增子串行長度2,可以到長度3了
ends=[2,4 ,5 #為什麼等於5,因為5沒找到啊,5就是當前最大的
dp=[1,1,2,3 #為什麼等於2,因為改的時ends的位置,代表4結尾最大長度遞增長度2+1=3
array=[3,2,4,5,1
ends=[2,4,5,
dp= [1,1,2,3
i=4時
array[4]=1 在 ends中比自己大的數字,找到了2,下標0,更新ends[0],並且dp[4]=1
ends=[1,4 ,5 #更新ends[0]
dp=[1,1,2,3,1 #
array=[3,2,4,5,1,3]
ends=[1,4,5,
dp= [1,1,2,3,1,
i=5時
array[5]=3 在 ends中比自己大的數字,找到了4,下標1,更新ends[1],並且dp[5]=2
ends=[1,3 ,5 #更新ends[1]
dp=[1,1,2,3,1,2] #
結束,
此時ends的有效長度 就是最大遞增子串行長度;
或者 記錄dp中的最大值
按此種方式優化,dp都不需要陣列,只需要記錄當前最大max就行
時間複雜度 遍歷array o(n) * 二分查詢o(logn) == n*logn
**,後續有空再補充
演算法 經典題六 題目六 陣列中子陣列最大累加和
輸入 陣列arr 輸出 子陣列中最大累加和 連續的,不是子串行 連續子陣列,還是子串行?子陣列 隱含概念,連續的 關鍵點 連續累加不小於0就加進來,小於零了,前面累加的都不要了,從新從0開始累加 curr記錄累加,只要curr不小於零,一直累加,因為curr 0對下乙個數字為結尾的都有用,但curr...
演算法題 陣列的最長遞增子串行
題目 給定乙個無序的陣列,返回其中最長遞增子串行的長度。解法 利用乙個輔助陣列1,記錄每個長度的lis的結尾字元,最後其長度就是所求值 輔助陣列2,與1同步變化,記錄陣列1中每個元素在輸入序列中的原始下標 輔助陣列3,與輸入陣列等長,記錄每個元素在乙個lis中的前驅下標。1 int binsearc...
經典演算法題每日演練 第五題 字串相似度
這篇我們看看最長公共子串行的另乙個版本,求字串相似度 編輯距離 我也說過了,這是乙個非常實用的演算法,在dna對比,網 頁聚類等方面都有用武之地。一 概念 對於兩個字串a和b,通過基本的增刪改將字串a改成b,或者將b改成a,在改變的過程中我們使用的最少步驟稱之為 編輯距離 二 解析 可能大家覺得有點...