Pythonで空席から最も近い占有席までの最大距離を求めるプログラム
0と1のみで構成されたリストseatsがあるとします。seats[i]は座席を表しており、値が1ならその座席は使用中(占有)、0なら空席を意味します。ここで、少なくとも1つの空席と1つの占有席が必ず存在するとき、ある空席から最も近い占有席までの距離の最大値を求める問題を考えます。
問題の例
例えば、入力が seats = [1, 0, 1, 0, 0, 0, 1] の場合、出力は 2 となります。これは、空席である seats[4] に座ると、左右どちらの占有席とも距離が2になり、これが最大となるためです。
解決のための手順
この問題は、リストを一度走査するだけで解くことができます。手順は以下の通りです。
- 結果を格納する変数
resを 0 で初期化します。 - 直前に見つけた占有席のインデックスを記録する変数
lastを -1 で初期化します。 nを seats のサイズとします。- i を 0 から n-1 まで繰り返します。
seats[i]が 1(占有席)の場合:resを、「last < 0ならば i、そうでなければ (i - last) / 2 の切り捨て値」とresのうち大きい方で更新します。lastを i に更新します。
- 最後に、
resとn - last - 1(末尾側の空席からの距離)の大きい方を返します。
アルゴリズムのポイント
隣接する2つの占有席の間にある空席の距離は、その中間点で最大化されるため、(i - last) // 2 で計算できます。また、先頭側(index 0 から最初の占有席まで)の距離は i、末尾側(最後の占有席から配列の終わりまで)の距離は n - last - 1 となるため、それぞれ別途考慮する必要があります。
実装例(Python)
def solve(seats):
res, last, n = 0, -1, len(seats)
for i in range(n):
if seats[i]:
res = max(res, i if last < 0 else (i - last) // 2)
last = i
return max(res, n - last - 1)
seats = [1, 0, 1, 0, 0, 0, 1]
print(solve(seats))
入力
[1, 0, 1, 0, 0, 0, 1]
出力
2
計算量
このアルゴリズムはリストを一度だけ走査するため、時間計算量は O(n)、追加のメモリ使用量は O(1) と非常に効率的です。
-
Pythonで二分木の2つのノード間の距離を求めるプログラム
二分木が与えられたとき、その中の2つのノード間の距離を求めることを考えます。グラフの場合と同じように、2つのノードを結ぶ経路上の辺(エッジ)の数を数え、その本数を距離として返します。 二分木のノード構造 木の各ノードは、次のような構造を持っています。 data : <整数値> right : <木の別のノードへのポインタ> left : <木の別のノードへのポインタ> 問題の例 例として、次のような二分木を考えてみましょう。 この木において、ノード「2」とノード「8」の間の距離を求めたいとします。このときの出力は 4 になります。 ノード2からノード8へ至
-
Pythonで二分木のノードとその子孫の最大絶対差を求めるプログラム
問題概要 二分木が与えられたとき、任意のノードとその子孫との間の絶対差の最大値を求めることを考えます。 例えば、次のような二分木が入力として与えられた場合を考えてみましょう。 この場合、ノード8とノード1の間の差が最も大きくなるため、出力は 7 となります。 解法のアプローチ:DFSを使った追跡 この問題は、DFS(深さ優先探索)を用いることで効率的に解けます。各ノードについて「その部分木内の最小値」と「最大値」を追跡しながら、現在のノードの値との差を順次更新していくのがポイントです。 具体的な手順は以下の通りです。 dfs() 関数を定義します。引数としてノードを受け取ります。 ノード