Pythonでフォロー関係リストから相互フォロワーを見つける方法
問題の概要
「relations」というリストがあると仮定します。このリストの各要素 relations[i] は2つの数値 [ai, bi] からなり、ソーシャルメディア上で「人物 ai が人物 bi をフォローしている」ことを表しています。ここで、互いにフォローし合っている人々(相互フォロワー)の一覧を求め、昇順にソートして返す必要があります。
たとえば、入力が relations = [[0, 2], [2, 3], [2, 0], [1, 0]] の場合、出力は [0, 2] となります。
解決のための手順
この問題は、次の手順で解くことができます。
- 空のセット
ansとseenを用意します。 - relations 内の各ペア (a, b) に対して、以下を繰り返します。
- ペア (a, b) を
seenに記録します。 - 逆のペア (b, a) がすでに
seenに存在する場合は、a と b をansに追加します。
- ペア (a, b) を
- 最後に
ansの要素をソートして返します。
実装例
理解を深めるために、以下のPythonコードを見てみましょう。
def solve(relations):
ans = set()
seen = set()
for a, b in relations:
seen.add((a, b))
if (b, a) in seen:
ans.add(b)
ans.add(a)
k = list(ans)
rtr = sorted(k)
return rtr
relations = [
[0, 2],
[2, 3],
[2, 0],
[1, 0]
]
print(solve(relations))入力
[[0, 2],[2, 3],[2, 0],[1, 0]]
出力
[0, 2]
アルゴリズムのポイント
このアルゴリズムでは、セット(set)を活用することで高速な存在確認を実現しています。ペア (a, b) を登録する際に、その逆向きのペア (b, a) がすでに登録されているかどうかをチェックすれば、相互フォローの関係を効率的に検出できます。セットへの追加や検索は平均 O(1) で行え、最終的なソートが O(n log n) となるため、データ量が多くても十分に実用的な速度で動作します。
-
Pythonでリストの累積和(累積合計)を求める方法
この記事では、リストの累積和(累積合計)を求める問題の解決策について詳しく解説します。問題文あるリストが与えられたとき、各要素までの累積和を格納した新しいリストを作成する必要があります。例えば、[10, 20, 30, 40, 50] というリストが与えられた場合、出力は [10, 30, 60, 100, 150] となります。これは、各位置でそれ以前の要素をすべて足し合わせた値です。実装例それでは、実際の実装を見ていきましょう。# 累積和を求める関数 def Cumulative(l): new = [] cumsum = 0 for element in l:
-
PythonでリストからN個の最大要素を取得する方法
整数のリストが与えられたとき、その中からN個の大きな要素を取り出して新しいリストとして返すのが、ここでの課題です。本記事では、基本的なループ処理による方法から、Python標準ライブラリを活用した効率的な方法まで、サンプルコードとともに解説します。 例 入力 : [40, 5, 10, 20, 9] N = 2 出力 : [40, 20] アルゴリズム 整数のリストと、取得する要素数Nを受け取ります。 N回のループを実行します。 各ループでリスト内の最大値を探し、新しいリストに格納すると同時に元のリストから削除します。 実装コード def Nnumberele(list1, N):