Pythonで配列内の要素を検索し、厳密に減少した後に増加するシーケンスを形成する方法
正の数からなる配列が与えられたとき、「最初に厳密に減少するシーケンスが続き、その後に厳密に増加する整数のシーケンスが続く」という形状を作り出す転換点(要素)を見つける問題を考えてみましょう。この問題には以下の条件があります。
- 各シーケンス(減少部分・増加部分)は最小長2以上である必要がある
- 減少シーケンスの最後の値は、増加シーケンスの最初の値と一致すること
例えば、入力が {5, 4, 3, 4} の場合、出力は 3 になります。{5, 4, 3} が厳密に減少しており、続いて {3, 4} が厳密に増加しているためです。
解法のアプローチ
この問題を解くために、以下の手順に従います。
- カウンター
increase := 1、decrease := 1を初期化する n := 配列のサイズとする- i を 1 から n まで繰り返す
array[i] < array[i-1]の場合:increase == 1ならば、decrease := decrease + 1- そうでなければ、
-1を返す
array[i] > array[i-1]の場合:increase == 1ならば、pt := array[i-1](転換点を記録)decrease >= 2ならば、increase := increase + 1- そうでなければ、
-1を返す
array[i] == array[i-1]の場合:-1を返す(等しい値は許されない)
- ループ終了後、
increase >= 2かつdecrease >= 2ならばptを返す - それ以外の場合は
-1を返す
実装例
理解を深めるために、以下のPythonコードを見てみましょう。
def search_element(array): increase = 1 decrease = 1 n = len(array) for i in range(1, n): if(array[i] < array[i-1]): if increase == 1: decrease = decrease + 1 else: return -1 elif(array[i] > array[i-1]): if increase == 1: pt = array[i-1] if decrease >= 2: increase = increase + 1 else: return -1 elif(array[i] == array[i-1]): return -1 if(increase >= 2 and decrease >= 2): return pt else: return -1 array = [5,4,3,4] element = search_element(array) print(element)
入力
[5,4,3,4]
出力
3
このアルゴリズムは配列を一度だけ走査するため、時間計算量は O(n)、追加のメモリ使用量は O(1) という効率的な性能を持ちます。隣接する要素が等しい場合や、減少→増加のパターンが崩れた場合には即座に -1 を返すことで、条件を満たさない配列を素早く判定できる点もポイントです。
-
Pythonで配列内の最大の要素を見つける方法を解説
この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を
-
Pythonで配列内の最大要素を見つける方法【初心者向け解説】
本記事では、配列の中から最大の要素を見つけるための解法とアプローチについて詳しく解説します。 問題の概要 配列が入力として与えられたとき、その中から最も大きい要素を見つけ出すことが課題となります。 アプローチ この問題は「線形探索」と呼ばれるシンプルな手法で解決できます。手順は以下の通りです。 まず、変数 max を配列の最初の要素で初期化します。 次に、2番目の要素から配列の末尾まで順番に走査していきます。 走査中の各要素について、現在の max の値と比較します。 要素が max より大きければ、max の値をその要素で更新します。 そうでなければ、そのまま次の要素へ進みます。 この処