Pythonでターゲット要素までの最小距離を求めるプログラムの解説
配列 nums と、2つの異なる値 target(nums 内に必ず存在する)および start が与えられたとします。このとき、nums[i] = target を満たすインデックス i の中から |i - start| が最小になるものを見つけ、その値を返すのが課題です。
例として、入力が nums = [3,4,5,6,7]、target = 7、start = 2 の場合を考えてみましょう。ターゲットに一致する値は nums[4] の1つだけなので i = 4 となり、|4 - 2| = 2 が出力されます。
解法のアプローチ
この問題は、配列を先頭から順に走査しながら、ターゲットと一致する要素のうち開始位置からの距離が最も小さいものを記録していくことで解けます。手順は以下の通りです。
- 変数
minimumを無限大(infinity)で初期化する iを 0 からnumsのサイズ未満の範囲で繰り返すnums[i]がtargetと一致する場合|i - start|が現在のminimumより小さければ、minimumを更新する
- ループ終了後、
minimumを返す
それでは、実際の実装を見て理解を深めましょう。
実装例
from math import inf def solve(nums, target, start): minimum = inf for i in range(len(nums)): if nums[i] == target: if abs(i - start) < minimum: minimum = abs(i - start) return minimum nums = [3,4,5,6,7] target = 7 start = 2 print(solve(nums, target, start))
入力
[3,4,5,6,7], 7, 2
出力
2
計算量について
このアルゴリズムは配列を1回だけ走査するため、時間計算量は O(n)、追加で必要なメモリは定数のみなので空間計算量は O(1) となります。線形探索によるシンプルな方法ですが、配列がソートされていない場合にも確実に動作する点が利点です。
-
Pythonで二値グリッドを整列させるための最小スワップ回数を求めるプログラム
問題の概要n × n の二値(0と1のみ)行列を考えます。この行列に対して、「隣接する2つの行を選んで入れ替える」という操作を1ステップとして実行できます。ここで求めたいのは、行列の主対角線より上側にあるすべての要素が 0 になるようにするために必要な最小スワップ回数です。どのように行を入れ替えても条件を満たせない場合は、-1 を返します。たとえば、次のような入力が与えられたとします。010011100この場合、出力は 2 になります。2回の隣接スワップで行を並べ替えれば、主対角線より上の要素をすべて 0 にできるからです。解き方のポイントこの問題を効率よく解く鍵は、各行を「右端にいくつ 0
-
Pythonで配列内の最大の要素を見つける方法を解説
この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を