Pythonで各要素を左側の最小値に置き換えるプログラム
問題の概要
数値のリスト nums が与えられたとき、各要素 nums[i] を「その要素より左側にある要素の中で最も小さい値」に置き換えることを考えます。ただし、先頭の要素 nums[0] の左側には要素が存在しないため、0 に置き換えます。
例えば、入力が [15, 7, 9, 16, 12, 25] の場合、出力は [0, 15, 7, 7, 7, 7] となります。2番目以降の要素が、それぞれ自分より左側の最小値で置き換えられているのが分かりますね。
解き方のアプローチ
この問題は、リストを一度だけ走査しながら「それまでに見た最小値」を変数に保持しておくことで、O(n) の計算量で効率的に解くことができます。具体的な手順は以下の通りです。
- リスト
numsが空の場合は、空のリストを返します。 - 変数
jにnums[0]の値を保存し、nums[0]を0に置き換えます。 - インデックス 1 からリストの末尾まで順に以下の処理を繰り返します。
- 現在の要素を一時変数
kに退避させます。 nums[i]をj(これまでの最小値)に置き換えます。jをjとkのうち小さい方の値で更新します。
- 現在の要素を一時変数
- すべての処理が完了したら
numsを返します。
実装例(Python)
以下に、上記の手順を実装したPythonコードを示します。
class Solution:
def solve(self, nums):
if not nums:
return []
j = nums[0]
nums[0] = 0
for i in range(1, len(nums)):
k = nums[i]
nums[i] = j
j = min(j, k)
return nums
ob = Solution()
nums = [15, 7, 9, 16, 12, 25]
print(ob.solve(nums))
入力
[15, 7, 9, 16, 12, 25]
出力
[0, 15, 7, 7, 7, 7]
コードの解説
このアルゴリズムの重要なポイントは、一時変数 k を使って元の値を退避させてから置き換えている点です。もし退避せずに nums[i] を直接書き換えてしまうと、次のステップで比較すべき「元の値」が失われてしまい、正しい結果が得られません。
また、リスト全体を1回だけ走査するため、時間計算量は O(n)、入力リスト自体を書き換える方式なら追加のメモリ使用量も O(1) に抑えられます。非常にシンプルかつ効率的な解法と言えるでしょう。
-
【Python】二分探索木でk番目に小さい要素を効率的に求めるアルゴリズムと実装例
問題の概要 二分探索木(BST: Binary Search Tree)と整数 k が与えられたとき、木の中で k 番目に小さい値を見つけることを考えます。 例えば、次のような二分探索木があるとします。 5 / \ 4 10 / \ 7 15 / \ 6 8 このとき k = 3 であれば、出力は 7 になります。 アプローチ:スタックを使った中順走査(In-order Traversal) 二分探索木には「中順走査を行うと、ノードを値の昇順に訪問できる」という重要な性質が
-
Pythonで学ぶ線形探索(リニアサーチ)の基本と実装方法
この記事では、最も基本的な検索アルゴリズムの一つである「線形探索(Linear Search)」の仕組みを理解し、Python 3.xでの実装方法をわかりやすく解説します。 線形探索のアルゴリズム 配列 arr[] の左端の要素から順に、目的の要素 x と各要素を一つずつ比較していきます x がいずれかの要素と一致した場合、そのインデックス(位置)を返します x が配列内のどの要素とも一致しなかった場合、-1 を返すか「要素が見つからない」ことを示します それでは、このアプローチの流れを視覚的に確認してみましょう。 実装例 def linearsearch(arr, x):