Pythonでリスト内のすべての1が連続して出現するかどうかをチェックする方法
少なくとも1つの要素の値が 1 である数値リスト nums が与えられたとします。このとき、リスト内のすべての 1 が連続して並んでいるかどうかを判定する問題を考えてみましょう。
たとえば、入力が nums = [8, 2, 1, 1, 1, 3, 5] の場合、1 は途中で途切れることなく連続して出現しているため、出力は True になります。
一方、入力が [8, 2, 1, 3, 1, 5] のような場合は、1 が離れて出現しているため、出力は False となります。
アルゴリズムの考え方
この問題は、状態を表すフラグ変数を1つ用意することで効率的に解けます。手順は以下の通りです。
- visited := 0 — フラグ変数を初期化します(0:まだ1を見ていない、1:現在1の連続の中、2:1の連続が一度終了した)。
numsの各要素xについて以下を繰り返します。xが1の場合:visitedが2(すでに1のグループが終了済み)であれば、Falseを返します。- そうでなければ
visitedを1に設定します。
xが1以外で、かつvisitedが 0 以外の場合:visitedを2に設定し、「1の連続が終了した」ことを記録します。
- ループが最後まで完了したら
Trueを返します。
この方法なら、リストを一度走査するだけで判定できるため、時間計算量は O(n)、空間計算量は O(1) という非常に効率的な実装になります。
実装例
それでは、実際のPythonコードを見てみましょう。
def solve(nums):
visited = 0
for x in nums:
if x == 1:
if visited == 2:
return False
visited = 1
elif visited:
visited = 2
return True
nums = [8, 2, 1, 1, 1, 3, 5]
print(solve(nums))
入力
[8, 2, 1, 1, 1, 3, 5]
出力
True
コードの解説
このコードでは、変数 visited が3つの状態を管理しています。
- 0:まだ
1を一度も見ていない状態 - 1:現在
1の連続の中にいる状態 - 2:
1の連続がすでに終了した状態
要素を順番に確認していき、1 の連続が終わった後(visited == 2)に再び 1 が出現した時点で False を返すことで、「すべての1が連続しているか」を正確に判定できます。最後まで問題がなければ True を返します。
-
Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム
問題の概要二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。例えば、次のような二分木が入力として与えられた場合、すべてのノードが同じ値を持っているため、出力は True になります。解決のアプローチこの問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。val が未定義の場合は、ro
-
Pythonで二分探索木(BST)に特定の値が存在するかどうかを判定する方法
問題の概要二分探索木(BST:Binary Search Tree)と、探索対象となる値 val が与えられたとき、その値が木の中に存在するかどうかを判定するプログラムを作成します。例えば、次のような二分探索木があったとします。このとき val = 7 とすると、7は木の中に存在するため、出力は True になります。アルゴリズムの手順BSTの性質を利用すると、効率的に値を探索できます。手順は以下の通りです。関数 solve() を定義します。引数として root(現在のノード)と val を受け取ります。root が null(None)の場合は False を返します。root のデータが