Pythonでソート済みリストから2つの数の合計がkになるか判定するプログラム
昇順にソートされた数値リスト nums と、別の値 k が与えられているとします。このとき、リストから選んだ2つの要素の合計が k と一致するかどうかを判定する必要があります。要素には負の数や0も含まれる可能性があります。さらに、この問題は定数のメモリ領域(空間計算量 O(1))で解くことが求められます。
例として、nums = [-8, -3, 2, 7, 9]、k = 4 の場合、出力は True になります。これは、7 と -3 を選ぶと 7 + (-3) = 4 となり、k と一致するためです。
解法のアプローチ:二ポインタ法
この問題は「二ポインタ(two-pointer)テクニック」を使うことで効率的に解けます。リストがすでにソートされていることを利用し、先頭と末尾にそれぞれポインタを配置し、合計値の大小に応じてポインタを動かしていくのがポイントです。
具体的な手順は以下の通りです。
i := 0(先頭のインデックス)j := リストの長さ - 1(末尾のインデックス)i < jの間、以下を繰り返します。cur_sum := nums[i] + nums[j]cur_sumがkと等しければTrueを返すcur_sumがkより小さければiを1増やす(合計を大きくする)- それ以外の場合は
jを1減らす(合計を小さくする)
- ループが終了したら
Falseを返す
実装例
理解を深めるために、以下のPythonコードを見てみましょう。
def solve(nums, k):
i = 0
j = len(nums) - 1
while i < j:
cur_sum = nums[i] + nums[j]
if cur_sum == k:
return True
elif cur_sum < k:
i += 1
else:
j -= 1
return False
nums = [-8, -3, 2, 7, 9]
k = 4
print(solve(nums, k))
入力
[-8, -3, 2, 7, 9], 4
出力
True
計算量について
このアルゴリズムでは、各ステップで必ずどちらかのポインタが移動するため、最悪でもリストの長さ分だけ繰り返しが行われます。したがって、時間計算量は O(n)、追加のデータ構造を使わないため空間計算量は O(1) となり、「定数のメモリ使用量で解く」という制約も満たしています。
-
Pythonで2つの未ソートリストをマージしてソート済みリストを作成する方法
このチュートリアルでは、2つのリストをマージし、その結果をソートされた順序で出力するPythonプログラムの作り方を解説します。数値のリストだけでなく、文字列のリストにも対応できる汎用的な方法なので、ぜひ最後までご覧ください。実現したいことまず、具体的な入力と出力の例を見てみましょう。例1:数値のリストの場合入力:list_1 = [1, 3, 2, 0, 3]list_2 = [20, 10, 23, 43, 56, -1]出力:[-1, 0, 1, 2, 3, 3, 10, 20, 23, 43, 56]例2:文字列のリストの場合入力:list_1 = [hafeez, aslan]lis
-
Pythonで2つの未ソートのリストをマージしてソート済みリストを作成する方法
ここでは、ユーザーが入力した2つのリストが与えられます。各リストの要素はソートされていない状態です。この記事の目的は、これら2つの未ソートのリストを1つにマージし、その後リスト全体を昇順に並べ替えることです。例入力: A[] = {100, 50, 150} B[] = {200, 30, 20} 出力: マージ後のリスト: {20, 30, 50, 100, 150, 200}アルゴリズムステップ1: まず、ユーザー入力による2つのリストを作成します。 ステップ2: 最終的なマージリストのサイズは「1つ目のリストのサイズ + 2つ目のリストのサイズ」になります。 ステップ3: s