Pythonで値と出現回数が同じ要素があるかどうかをチェックするプログラム
数値のリスト nums が与えられたとき、「その値自身と出現回数(頻度)が一致している要素」がリスト内に存在するかどうかを判定する問題を考えます。
たとえば、入力が nums = [2,5,7,5,3,5,3,5,9,9,5] の場合、値 5 がちょうど5回出現しているため、出力は True になります。
解決のアプローチ
この問題は、次の手順で解くことができます。
nums_c:=nums内に存在する各要素の出現頻度を格納したリストを作成するnums_c内の各値iとその頻度jについて以下を繰り返すiとjが等しい場合はTrueを返す
- 該当する要素が見つからなければ
Falseを返す
実装例
Pythonでは collections.Counter を使うことで、各要素の出現回数を簡単に取得できます。以下に実装例を示します。
from collections import Counter
def solve(nums):
nums_c = Counter(nums)
for i, j in nums_c.items():
if i == j:
return True
return False
nums = [2,5,7,5,3,5,3,5,9,9,5]
print(solve(nums))
入力
[2,5,7,5,3,5,3,5,9,9,5]
出力
True
計算量について
Counter による頻度集計は O(n)、各要素の確認も O(k)(kはユニークな要素数)であるため、全体の計算量は O(n) となり、非常に効率的です。リストのサイズが大きくなっても実用的に動作します。
-
【Python】グラフ内の2つのノードに共通して到達可能なノードが存在するかを判定するプログラム
問題概要 有向グラフのエッジリストが与えられます。グラフは n 個のノードから構成され、ノード名は 0 から n-1 までです。さらに、2つの整数値 a と b が与えられます。ここで、「あるノード c から a への経路と、c から b への経路がどちらも存在する」という条件を満たすノード c が存在するかどうかを判定するのが課題です。 例として、下図のようなグラフを考えてみましょう。 a = 2、b = 3 の場合、出力は True になります。これは c = 0 とおくと、0 から 2 への経路と 0 から 3 への経路がどちらも存在するためです。 解法の考え方:逆グラフとDFSの組
-
Pythonで二分探索木(BST)に特定の値が存在するかどうかを判定する方法
問題の概要二分探索木(BST:Binary Search Tree)と、探索対象となる値 val が与えられたとき、その値が木の中に存在するかどうかを判定するプログラムを作成します。例えば、次のような二分探索木があったとします。このとき val = 7 とすると、7は木の中に存在するため、出力は True になります。アルゴリズムの手順BSTの性質を利用すると、効率的に値を探索できます。手順は以下の通りです。関数 solve() を定義します。引数として root(現在のノード)と val を受け取ります。root が null(None)の場合は False を返します。root のデータが