このアプローチは、リストに重複が含まれていない場合に機能します。おそらく、それらは最初に効率的に処理できます。
フェンウィック木を使用して、O(n * log n)
時間と空間の順列反転ベクトルを計算できます。O(n)
同じ番号のベクトルの連続セグメントは、カットする必要のないセクションを表すことができます。残念ながら、次のような誤検知を返すこともあります。
Array: {8,1,4,5,7,6,3}
Vector: 0,1,1,1,1,2,5
ここで6
と3
は、シーケンスのカットを意味し[1,4,5,7]
ます。これに対抗するために、各要素に続く小さな要素の数を表す 2 番目の反転ベクトルを取得します。両方のベクトルで平行な連続セグメントは、カットする必要はありません。
Array: {8,1,4,5,7,6,3,0}
Vector: 0,1,1,1,1,2,5,7 // # larger preceding
Vector: 7,1,2,2,3,2,1,0 // # smaller following
|---| // not cut
Array: {3,1,4,5,2,8,7}
Vectors: 0,1,0,0,3,0,1
2,0,1,1,0,1,0
|---| // not cut
Array: {3,1,2,4}
Vectors: 0,1,1,0
2,0,0,0
|---| // not cut