Pythonで最高地点の標高を求めるアルゴリズム:累積和の考え方と実装例
ロードトリップに出かけたバイク乗りを想像してみてください。旅路にはn個の地点があり、それぞれ標高が異なります。バイク乗りは標高0の地点0から旅をスタートします。ここで、n個の要素を持つ配列gainが与えられ、gain[i]は地点iと地点i+1の間の標高の変化量(正の値なら上り、負の値なら下り)を表すものとします。このとき、旅路全体で最も高い地点の標高を求めるのが今回の課題です。
たとえば、入力がgain = [-4, 2, 6, 1, -6]だった場合、出力は5になります。これは、各時点の標高が[0, -4, -2, 4, 5, -1]と推移し、その中で最大値が5であるためです。
解き方のアプローチ
この問題は「累積和(ランニングサム)」の考え方を使うと、非常にシンプルに解くことができます。手順は以下の通りです。
maximum:= 0(これまでの最大標高)run_alt:= 0(現在の標高)gain内の各要素deltaについて以下を繰り返す:run_alt:=run_alt + delta(標高を更新)maximum:=maximumとrun_altのうち大きい方
maximumを返す
この方法なら、配列を一度走査するだけで答えが得られるため、計算量はO(n)、追加のメモリはO(1)と非常に効率的です。
Pythonでの実装例
理解を深めるために、実際のコードを見てみましょう。
def solve(gain):
maximum = 0
run_alt = 0
for delta in gain:
run_alt += delta
maximum = max(maximum, run_alt)
return maximum
gain = [-4, 2, 6, 1, -6]
print(solve(gain))
入力
[-4,2,6,1,-6]
出力
5
まとめ
この問題のポイントは、各地点の標高を順番に足し合わせながら、その都度最大値を更新していく点です。累積和のテクニックは、気温の変化や口座残高の推移など、連続的な増減を扱うさまざまな場面で応用できるため、ぜひ覚えておきましょう。
-
Pythonで行列の転置を求めるプログラム
この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ
-
Pythonで配列(リスト)の合計を求める方法をわかりやすく解説
この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に