Pythonで多数決により過半数の票を獲得した候補者のIDを見つける方法
本記事では、Pythonを使って多数決(過半数)を獲得した候補者のIDを見つけるプログラムを解説します。
問題の概要
n個の値を含む数値リスト nums があるとします。各数値は候補者への1票を表しています。この中から、floor(n/2) より多くの票を獲得した候補者のIDを見つけます。もし過半数の票を獲得した候補者が存在しない場合は、-1 を返します。
例えば、入力が nums = [6, 6, 2, 2, 3, 3, 3, 3, 3] の場合を考えてみましょう。リストの長さは9なので、過半数となるには5票以上が必要です。数値「3」は5回出現しているため、出力は 3 となります。
解決の手順
l:= リストnumsのサイズ(要素数)を取得します。count:= 各数値とその出現回数を格納したマップ(Counterを使用)を作成します。count内の各数値iと出現回数jについて、以下の処理を繰り返します。j > (l // 2)(出現回数が要素数の半分より多い)であれば、iを返します。
- 該当する候補者が見つからなければ、
-1を返します。
実装例
それでは、実際のコードを見てみましょう。
class Solution: def solve(self, nums): l = len(nums) from collections import Counter count = Counter(nums) for i, j in count.items(): if j > (l // 2): return i return -1 ob = Solution() nums = [6, 6, 2, 2, 3, 3, 3, 3, 3] print(ob.solve(nums))
入力
[6, 6, 2, 2, 3, 3, 3, 3, 3]
出力
3
コードのポイント
このソリューションの鍵となるのは、Python標準ライブラリの collections.Counter です。Counterはリスト内の各要素の出現回数を自動的に集計してくれるため、手動でカウント処理を実装する必要がなく、コードが非常にシンプルになります。
計算量についても確認しておきましょう。Counterによる集計はO(n)、その後の出現回数チェックのループも最大でO(n)程度であるため、アルゴリズム全体としてO(n)の時間計算量で動作し、大規模なデータに対しても効率的に処理できます。
また、過半数の候補者が存在しないケース(例:[1, 2, 3] のように全ての票が分散している場合)でも、ループが完了した時点で -1 が正しく返される点にも注目してください。
-
Pythonで最長連続シーケンスの長さを求めるアルゴリズムと実装方法
問題概要ソートされていない数値の配列が与えられたとき、その中から連続する要素で構成される最長シーケンスの長さを見つける問題を考えてみましょう。ここでいう「連続」とは、値が1ずつ増えていく数列(例:4, 5, 6, 7)のことを指します。例えば、入力が nums = [70, 7, 50, 4, 6, 5] の場合、最も長い連続シーケンスは [4, 5, 6, 7] となるため、答えは 4 になります。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。まず、配列をセット(set)に変換して重複を除去します。これにより、要素の存在確認が O(1) で行えるようになります。各要素
-
Pythonで1からNまでの範囲の欠落している数字をすべて見つけるプログラム
サイズ n の整数リスト nums があり、リスト内のすべての数値は区間 [1, n] に含まれているとします。このとき、一部の要素は2回出現し、その他は1回だけ出現します。この課題では、[1, n] の範囲のうちリストに存在しない数値(欠落している数字)をすべて見つけ、昇順に並べて返す必要があります。できるだけ線形時間 O(n) で動作する効率的な解法を目指しましょう。 例えば、入力が [4, 4, 2, 2, 6, 6] の場合、出力は [1, 3, 5] となります。 解法のアプローチ この問題は「カウント配列(各数値の出現回数を記録する配列)」を使うことでシンプルに解決できます。手順は