【Python】配列を等差数列に並べ替えられるかどうかを判定するプログラムの書き方
問題の概要
整数のリスト nums が与えられたとき、その要素を並べ替えることで「隣り合う2つの要素の差がすべて等しい」状態(つまり等差数列)にできるかどうかを判定するプログラムを作成します。
例えば、入力が nums = [8, 2, 6, 4] の場合、出力は True になります。これは、リストを [2, 4, 6, 8] のように並べ替えると、隣接する要素同士の差がすべて 2 で一定になるためです。
解法のアプローチ
この問題は非常にシンプルな考え方で解決できます。ポイントは「並べ替え方が自由」であることです。もし条件を満たす並べ方が存在するなら、昇順にソートした順序が必ずその一つになります。なぜなら、等差数列はソートした順序でこそ一定の間隔が現れるからです。
したがって、以下の手順で判定できます。
- N を nums の要素数とします
- N ≤ 2 の場合、2要素以下なら必ず条件を満たせるので True を返します
- リスト nums を昇順にソートします
- targetDiff(目標となる差)を nums[1] - nums[0] として求めます
- i を 2 から N-1 まで繰り返し、nums[i] - nums[i-1] が targetDiff と異なる場合は False を返します
- すべてのチェックを通過したら True を返します
実装例
以下がPythonでの実装コードです。
def solve(nums):
N = len(nums)
if N <= 2:
return True
nums.sort()
targetDiff = nums[1] - nums[0]
for i in range(2, N):
if nums[i] - nums[i - 1] != targetDiff:
return False
return True
nums = [8, 2, 6, 4]
print(solve(nums))入力
[8, 2, 6, 4]
出力
True
計算量について
このアルゴリズムの時間計算量は、ソート処理が支配的となるため O(N log N) です。空間計算量は、インプレースでソートを行う場合は O(1)(追加領域なし)となります。要素数が多い場合でも効率的に動作する、実用的な解法といえます。
-
Pythonで特定の操作を繰り返して全要素を等しくする最小手順を求めるプログラム
数値のリスト nums が与えられ、すべての値を等しくすることを考えます。ここで「リストから1つの要素を選び、それ以外のすべての値を1ずつ増やす」という操作が許されているとします。このとき、すべての要素の値を等しくするために必要な最小の操作回数を求めます。 たとえば、入力が [2, 4, 5] の場合、出力は 5 になります。 解法のポイント 「選んだ要素以外を1ずつ増やす」という操作は、相対的な差に注目すると「選んだ1つの要素だけを1減らす」操作と同じ効果があります。そこで、各要素をリストの最小値まで揃えることを考えると、各要素 num に必要な操作回数は num - min_val となり
-
Pythonで配列をジグザグ配列に変換する!最小の操作回数を求めるアルゴリズム
問題の概要 整数の配列 nums が与えられます。ここでいう「1回の操作」とは、任意の要素を1つ選び、その値を1だけ減らすことを指します。 配列 A が「ジグザグ配列」であるとは、以下の条件のいずれか一方を満たすことです。 偶数インデックスの要素が隣接要素より大きいパターン: A[0] > A[1] < A[2] > A[3] < A[4] > ... という形になります。 奇数インデックスの要素が隣接要素より大きいパターン: A[0] < A[1] > A[2] < A[3] > A[4] < ... という形になります。 この