Pythonで数値リストから等差部分列の個数を求めるプログラム
数値のリスト nums が与えられたとき、長さ3以上の等差部分列(算術サブシーケンス)の個数を求める問題を考えてみましょう。等差数列とは、隣り合う数同士の差がすべて等しい数列のことです。
例えば、入力が nums = [6, 12, 13, 8, 10, 14] の場合、出力は 3 になります。これは、[6, 8, 10]、[6, 10, 14]、[12, 13, 14] という3つの等差部分列が存在するためです。
解法のアプローチ:動的計画法(DP)
この問題は、動的計画法を使って効率的に解くことができます。各インデックスと公差(差分)の組み合わせごとに、そこで終わる等差部分列の個数を記録していくのがポイントです。
具体的な手順は以下の通りです。
dp:= 新しいマップ(辞書)を作成n:= nums のサイズres:= 0(答えを格納する変数)i を 0 から n まで繰り返す:
j を 0 から i まで繰り返す:
diff:= nums[i] - nums[j](公差を計算)prev:= dp[(i, diff)]、存在しない場合は 0prevprev:= dp[(j, diff)]、存在しない場合は 0dp[(i, diff)]:= prev + prevprev + 1res:= res + prevprev
resを返す
仕組みの解説
ペア (j, i) に対して公差 diff を計算するとき、dp[(j, diff)] は「インデックス j で終わり、公差が diff である等差部分列の個数」を表します。これらの部分列に nums[i] を連結すると長さが1つ増えた新しい等差部分列になるため、その個数(prevprev)を答え res に加算します。これにより、長さ3以上の等差部分列だけが正確にカウントされます。
Pythonコード例
class Solution:
def solve(self, nums):
dp = {}
n = len(nums)
res = 0
for i in range(n):
for j in range(i):
diff = nums[i] - nums[j]
prev = dp.get((i, diff), 0)
prevprev = dp.get((j, diff), 0)
dp[(i, diff)] = prev + prevprev + 1
res += prevprev
return res
ob = Solution()
nums = [6, 12, 13, 8, 10, 14]
print(ob.solve(nums))
入力
[6, 12, 13, 8, 10, 14]
出力
3
このアルゴリズムの計算量は、二重ループを使用するため O(n²) となり、空間計算量も O(n²) です。リストの要素数がそれほど大きくない場合に、効率的かつシンプルに等差部分列を数えることができます。
-
Pythonでリスト内の最小値を見つける方法を解説
この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。
-
PythonでリストからN個の最大要素を取得する方法
整数のリストが与えられたとき、その中からN個の大きな要素を取り出して新しいリストとして返すのが、ここでの課題です。本記事では、基本的なループ処理による方法から、Python標準ライブラリを活用した効率的な方法まで、サンプルコードとともに解説します。 例 入力 : [40, 5, 10, 20, 9] N = 2 出力 : [40, 20] アルゴリズム 整数のリストと、取得する要素数Nを受け取ります。 N回のループを実行します。 各ループでリスト内の最大値を探し、新しいリストに格納すると同時に元のリストから削除します。 実装コード def Nnumberele(list1, N):