Pythonのバイナリ行列で最大パス長を見つける
この問題では、各要素が0または1のいずれかでサイズmXnの正方行列mat[][]が与えられます。要素の値が1の場合、これは接続されていることを意味し、値が0の場合、これは接続されていません。私たちのタスクは、バイナリ行列で最大パス長を見つけることです。
問題の説明 −問題を解決するには、マトリックス上で最大の長さのパスを見つける必要があります。これは、マトリックス内の1つの要素すべてを意味します。パスを見つける前に、最大で1つを0から1に変換します。
問題を理解するために例を見てみましょう
入力
mat[][] = {{1, 0},
{0, 1}} 出力
3
説明
We can convert 0 at index (0, 1) or (1, 0) to maximise the path length.
ソリューションアプローチ
この問題の簡単な解決策は、各0を1に変換した後に長さを見つけることです。まず深さ優先探索を使用してパスの長さを見つけ、次にすべてのパスの長さの最大値を返します。
効率的な解決策は、複数の変換を行う必要をなくし、最も有望な解決策を提供するものに落ち着くことです。 1つを0から1に切り替えると、最大の長さのパスが返されるようなグループが見つかります。
ソリューションの動作を説明するプログラム
例
def FindNeighbor(R, C, N):
for nr, nc in (((R - 1), C), ( (R + 1) , C), (R, (C - 1) ), (R, (C + 1) )):
if 0 <= nr < N and 0 <= nc < N:
yield nr, nc
def DFSTraversal(R, C, index, mat, N):
maxLen = 1
mat[R][C] = index
for nr, nc in FindNeighbor(R, C, N):
if mat[nr][nc] == 1:
maxLen += DFSTraversal(nr, nc, index)
return maxLen
def findLargestPath(mat):
N = len(mat)
maxPath = {}
index = 2
for i in range(N):
for j in range(N):
if mat[i][j] == 1:
maxPath[index] = DFSTraversal(i, j, index, mat, N)
index += 1
maxPathLen = max(maxPath.values() or [0])
for i in range(N):
for j in range(N):
if mat[i][j] == 0:
seen = {mat[nr][nc] for nr, nc in FindNeighbor(i, j, N) if mat[nr][nc] > 1}
maxPathLen = max(maxPathLen, 1 + sum(maxPath[i] for i in seen))
return maxPathLen
I = [[1, 0], [0, 1]]
print("The length of largest path is " + str(findLargestPath(I))) 出力
The length of largest path is 3
-
Pythonで二分木の最大幅を見つけるプログラム
二分木があるとすると、ツリー内の任意のレベルの最大幅を見つける必要があります。ここで、レベルの幅は、左端のノードと右端のノードの間に保持できるノードの数です。 したがって、入力がのような場合 その場合、出力は2になります これを解決するために、次の手順に従います- マップdを作成し、最小値と最大値を保持するには、最小値は最初は無限大で、最大値は0です 関数dfs()を定義します。これはルートを取ります、pos:=0、depth:=0 ルートがnullの場合、戻り値はありません d [depth、0] =d [depth、0]とposの最小値 d [d
-
Pythonでの二分木最大パス合計
空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri