Pythonでリスト内のすべての部分リストに一意な要素が含まれているかをチェックするプログラム
要素を格納したリスト nums が与えられ、そのすべての部分リスト(サブリスト)について「その部分リスト内でちょうど1回だけ出現する要素が少なくとも1つ存在するか」を判定する問題を考えます。この問題は線形時間で解くことが求められます。
たとえば、入力が nums = [5, 10, 20, 10, 0] の場合、出力は True になります。これは、[[5], [10], [20], [10], [0], [5,10], [10,20], [20,10], [10,0], [5,10,20], [10,20,10], [20,10,0], [5,10,20,10], [10,20,10,0], [5,10,20,10,0]] のように生成されるすべての部分リストに、出現頻度が1の要素が必ず含まれているためです。
解法のアプローチ
この問題を解くために、以下の手順に従います。
has_unique()関数を定義します。この関数はleftとrightを引数に取ります。left >= rightの場合はTrueを返します(範囲が空または要素数1なら条件は自明に満たされます)。counts:nums[left]からnums[right]までに含まれる各要素の出現回数を記録した辞書を作成します。countsの最小値が 1 より大きい場合(= すべての要素が2回以上出現している場合)はFalseを返します。start := leftと初期化します。indexをleftからrightまでループさせます。counts[nums[index]] == 1(その要素が一意である)の場合:has_unique(start, index - 1)がFalseであればFalseを返します。start := index + 1と更新します。
- 最後に
has_unique(start, right)を返します。 - メイン処理からは
has_unique(0, len(nums) - 1)を呼び出して結果を返します。
このアルゴリズムのポイントは、一意な要素(1回だけ出現する要素)を境界として区間を分割し、それぞれの小区間に対して再帰的に同じ判定を行う点です。ある区間内に一意な要素がひとつも存在しなければ、その区間は条件を満たさないため False となります。
実装例
以下の実装を見ると、理解がより深まるでしょう。
from collections import Counter def solve(nums): def has_unique(left, right): if left >= right: return True counts = Counter(nums[left : right + 1]) if min(counts.values()) > 1: return False start = left for index in range(left, right + 1): if counts[nums[index]] == 1: if not has_unique(start, index - 1): return False start = index + 1 return has_unique(start, right) return has_unique(0, len(nums) - 1) nums = [5, 10, 20, 10, 0] print(solve(nums))
入力
[5, 10, 20, 10, 0]
出力
True
-
Pythonでソート済みリストの順序を保ったまま要素を挿入する2つの方法
本記事では、ソート済みのリストに対して、その並び順を崩すことなく新しい要素を挿入する方法について解説します。 問題文 リストが与えられたとき、既存のソート順を維持したまま、指定した要素を適切な位置に挿入する必要があります。 この問題を解くには、主に以下の2つのアプローチがあります。 アプローチ1:線形探索による力まかせ法(ブルートフォース) まず、挿入すべき位置をリストの先頭から順に走査して見つけ出し、そこへ要素を挿入するというシンプルな方法です。挿入する要素より大きい値が最初に現れた位置に、新しい要素を差し込みます。 コード例 n: index = i
-
サブリストの2番目の要素を基準にリストをソートするPythonプログラム
ネストされたリスト(リストの中にリストが入っている構造)が与えられたとき、各サブリストの2番目の要素を基準にして全体を並べ替えるのが本記事の目的です。ここでは、最も基本的なソートアルゴリズムである「バブルソート」を使った実装方法を解説します。 実行例 入力 : [[CCC, 15], [AAA, 10], [RRRR, 2],[XXXX, 150]] 出力 : [[RRRR, 2], [AAA, 10], [CCC, 15], [XXXX, 150]] アルゴリズムの手順 ステップ1:対象となるリストを受け取る。 ステップ2:ネストされたループを使い、サブリストの2番目の要素にアクセスできるよ