以下のような特徴を持っている整数行列があります:
- 隣接する位置にある数字は異なっています。
- マトリックスは、n行m列を有します。
- 私は<全てのmについて、A [0] [i]は<A [1]〜[I] && A [N - 2] [I]> A [N - 1] [I]。
- 全てのj <NについてA [j] [0] <[J] [1] && A [j]は[M - 2]> A [j]は[M - 1]。
私たちは、Pがあれば、PEEKの位置を定義します。
A[j][i] > A[j+1][i] && A[j][i] > A[j-1][i] && A[j][i] > A[j][i+1] && A[j][i] > A[j][i-1]
行列を考えます:
[
[1 ,2 ,3 ,6 ,5],
[16,41,23,22,6],
[15,17,24,21,7],
[14,18,19,20,10],
[13,14,11,10,9]
]
リターン41の指標(ある[1,1]
)、または24のインデックス(あります[2,2]
)
アイデアは、約2分後に、上側と下半分にあります。T(N)= O(N)の複雑+ O(N / 2)+ T(N / 2)... T(N)= O(N)+ O(N / 2)+ O(N / 2)+ O(N / 4)... = 3 *(O(N / 2)+ O(N / 4)+ ...)= O(N)
クラスソリューション: #1 @paramのA:リスト整数のリスト #1 @return:位置の指標は、例えば、整数のリストである[2,2] DEF findPeakII(自己、A): もし ない: 戻り [-1 、-1 ] 、L = 1 、R = LEN([0]) - 2 アップ = 1 ダウン = LEN(A) - 2つの インポートSYS ながら L + 1 <R と + 1 <アップダウン: midRow =(アップ+ダウン)/ 2 rowMax = - sys.maxint - 1 #真ん中の行の最大値 のための I にはxrange(L、R + 1): #は、中段に最大値を見つけ た場合、[midRow] [I]> :rowMax index1の = I rowMax = A [midRow] [I] もし [index1の<rowMax - [1 midRow] と A [midRow + 1] [index1の< :rowMax 戻り[midRow、index1の]を 他: 場合 [midRow - 1] [index1の]> rowMax: ダウン = midRow 他: 最大 = midRow colMax = -sys.maxint - 1 のための J ではxrange(上下に、+ 1 ): もし [J] [index1の]> colMax: INDEX2 = J colMax = A [j]と[index1の] なら [ INDEX2] [index1の- 1] <colMax 及び A [INDEX2] [index1の+ 1] < colMax: リターン[INDEX2、index1の] 他: もし [INDEX2] [index1の-1]> :colMax R = index1の 他: L = index1の 場合 [最大] [L]> A [DOWN] [L] または [最大] [R]> A [DOWN] [R]: 最初 = アップ 他: 最初 = ダウン 場合 [第] [L]> A [最初] [R]: 第二 = L 他: 第二 = Rの リターン [第一、第二】
ます。https://www.cnblogs.com/sherylwang/p/5602711.htmlで再現