Pythonでソート後に正しい位置にある要素の数をカウントする方法
問題の概要
数値のリスト nums が与えられたとき、そのリストをソートした場合に元の位置から動かない要素(正しいインデックスに配置される要素)がいくつあるかを求めるプログラムをPythonで作成します。
例えば、入力が [2, 8, 4, 5, 11] の場合を考えてみましょう。このリストを昇順にソートすると [2, 4, 5, 8, 11] になります。比較すると、先頭の「2」と末尾の「11」はソート前後で同じ位置に留まっています。したがって、出力は 2 となります。
解決のアプローチ
この問題は、以下の手順でシンプルに解くことができます。
- リスト
numsをソートした新しいリストsを作成する - カウンター
countを 0 で初期化する - 0 から
numsのサイズまでループを回し、各インデックスiについてs[i]とnums[i]を比較する - 両者が一致していれば
countを 1 増やす - 最後に
countを返す
それでは、実際の実装を見てみましょう。
実装例
class Solution: def solve(self, nums): s = sorted(nums) count = 0 for i in range(len(nums)): if s[i] == nums[i]: count += 1 return count ob = Solution() print(ob.solve([2, 8, 4, 5, 11]))
入力
[2, 8, 4, 5, 11]
出力
2
コードのポイント
この実装では、Pythonの組み込み関数 sorted() を使うことで元のリストを変更せずにソート済みのコピーを作成しています。これにより、元のリストとの比較が容易になります。計算量はソート部分が O(n log n)、比較部分が O(n) となるため、全体として O(n log n) の時間計算量で処理できます。また、zip() 関数を使えば sum(a == b for a, b in zip(nums, sorted(nums))) のように、より簡潔に同じ結果を得ることも可能です。
-
Pythonで要素の合計が2の累乗になるインデックスペアの数を数えるプログラム
問題の概要数値のリスト nums が与えられたとします。このとき、i < j を満たすインデックスのペア (i, j) のうち、nums[i] + nums[j] が 2 の累乗(2^k、k ≥ 0)と等しくなるものの個数を求めます。例えば、入力が nums = [1, 2, 6, 3, 5] の場合、出力は 3 になります。これは、合計が 2 の累乗となるペアが次の 3 つ存在するためです。(2, 6):合計は 8(3, 5):合計は 8(1, 3):合計は 4解決のためのアプローチこの問題を効率よく解くために、以下の手順に従います。結果を格納する変数 res を 0 で初期化します。
-
Pythonでn個のノードから構成できる二分探索木(BST)の数を求める方法
問題の概要互いに異なるn個のノードが与えられたとき、それらを二分探索木(BST:Binary Search Tree)として配置する方法が何通りあるかを求めることを考えます。二分探索木には「左部分木には常に親より小さい値が、右部分木には常に親より大きい値が格納される」という重要な性質があります。この問題を解くには、カタラン数(Catalan Number)を利用します。カタラン数 C(n) は、n個の異なるキーから構成できる二分探索木の総数を正確に表すことが知られています。計算式は次のとおりです。$$C(n)=\frac{(2n)!}{(n+1)!\times n!}$$例えば、入力が n =