時間複雜度: o(n×m)。
空間複雜度: o(n×m)。
n 表示陣列 a 的長度,m 表示陣列 b 的長度。
空間複雜度還可以再優化,利用滾動陣列可以優化到 o(min(n,m))。
**實現:
陣列a=[1,2,3,2,1]
陣列b=[3,2,1,4,7]
public
intfindlength
(int
a,int[
]b)}
return ans;
}
**執行流程分析及結果圖:
最長的公共子陣列就是上面紅色所對應的[3,2,1],長度是3。
時間複雜度:o((n+m)×min(n,m))。
空間複雜度:o(1)。
n 表示陣列 a 的長度,m 表示陣列 b 的長度。
**實現:
public
intfindlength2
(int
a,int[
] b)
//視窗向左滑動
for(
int i =
0; i < m; i++
)return ret;
}//求每次滑動視窗後最長的公共子陣列長度
public
intmaxlength
(int
a,int[
] b,
int adda,
int addb,
int len)
else
ret = math.
max(ret, k)
; system.out.
println
(i+" "
+ret);}
return ret;
}
**執行流程分析及結果圖:
最長的公共子陣列就是上面紅色所對應的[3,2,1],長度是3。是在第乙個for迴圈是i=3,len=2,的時候取得。
其實兩種方法的本質是一樣的,滑動視窗法相當於用時間複雜度換得動態規劃法的空間複雜度。看做滑動視窗法容易理解一些,如兩個陣列a、b,都相當於移動陣列b,使得b陣列的起始位置對應第a陣列的不同位置,然後求得兩個陣列公共部分的最長相同子陣列的長度,依次類推,求出每個起始位置對應的相同子陣列長度,然後取最大值即可。
求兩個陣列的交集 最長公共字首
解 兩個指標比較是否相等即可 class solution return ans 如果給定陣列已經排好序,優化版 1,設定兩個指標,比較兩個指標指向元素,相同元素放進空白陣列 2 不同元素,將指標指向小的元素後移 3,重複以上步驟,知道任意乙個陣列終止 class solution return a...
求兩個陣列的交集
問題 給你兩個排序的陣列,求兩個陣列的交集。比如 a 1 3 4 5 7,b 2 3 5 8 9,那麼交集就是 3 5.思路 1.每一次從b陣列中取一值,然後在a陣列裡逐個比較,如果有相等的,則儲存。該演算法複雜度為 o mn m,n 分別為陣列 a b 的長度。2.因為a b 都排過序,所以,每一...
求兩個陣列的交集
方法 先用a建立 有序二叉樹,然後用b中的數值依次在二叉樹中尋找,如果找到了,就增加到交集陣列中 複雜度 建立二叉樹的複雜度logn,在二叉樹中查詢的複雜度是 logn m 1 include stdio.h int commonarray 20 int com len 0 struct node ...