Python

 Computer >> コンピューター >  >> プログラミング >> Python
  1. Pythonで2つの区間リストの重複部分を見つけて昇順に返す方法

    閉区間(closed interval)からなる2つのリストがあるとします。それぞれのリストは単体では区間同士が重複しておらず、開始位置の昇順(非減少順)にソートされています。この記事では、2つのリストに共通して含まれる「重複する区間」をすべて見つけ出し、昇順に並べて返すPythonプログラムを解説します。 たとえば、入力が inv1 = [[50, 100],[190, 270],[310, 330]] と inv2 = [[40, 120],[180, 190]] の場合、出力は [[50, 100], [190, 190]] になります。 アルゴリズムの流れ この問題は、マージ処理など

  2. Pythonで重なる区間をマージし、昇順に並べ替える方法

    問題の概要区間(インターバル)のリストが与えられたとき、それらを統合(マージ)し、ソート済みのシーケンスとして返すことを考えます。例えば、入力が inv = [[2, 5], [4, 10], [20, 25]] の場合、[2, 5] と [4, 10] は重なっているため [2, 10] にまとめられ、出力は [[2, 10], [20, 25]] となります。解決の手順この問題は以下のステップで解くことができます。まず、区間のリストを開始位置を基準にソートします。これにより、マージ対象となる区間が必ず隣接するようになります。結果を格納するための新しいリスト ans を用意します。ソート済み

  3. Pythonでグローバル反転とローカル反転の数が一致しているかを判定するプログラム

    問題の概要 重複のない数値のリスト nums が与えられたとします。グローバル反転(global inversion)とは、i < j かつ nums[i] > nums[j] を満たすインデックスの組 (i, j) が存在することを指します。一方、ローカル反転(local inversion)とは、隣接するインデックス i と i + 1 の間で nums[i] > nums[i + 1] が成り立つことです。 この記事では、グローバル反転の総数とローカル反転の総数が一致しているかどうかを判定するプログラムを紹介します。 たとえば、入力が nums = [3, 2, 4]

  4. PythonでリストBの少なくともk個の要素より厳密に小さいリストAの要素数を求める方法

    数値のリストAとB、および整数kが与えられたとき、「Bの少なくともk個の要素よりも厳密に小さい」Aの要素の個数を求める問題を考えてみましょう。例えば、入力が A = [6, -2, 100, 11]、B = [33, 6, 30, 8, 14]、k = 3 の場合、出力は 3 になります。これは、-2、6、11 の3つの要素が、それぞれBの3つ以上の要素よりも厳密に小さいためです。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。kが0の場合は、条件が常に満たされるため、Aの要素数をそのまま返します。Bを降順にソートします。これにより、B[k-1]は「Bの中でk番目に大きい要

  5. Pythonで合計がkの倍数となる長さ2以上の部分リストを検出する方法

    非負の整数からなるリスト nums と、正の整数 k が与えられたとします。このとき、要素の合計が k の倍数になる「長さ 2 以上の部分リスト(サブリスト)」が存在するかどうかを判定します。 たとえば、入力が nums = [12, 6, 3, 4]、k = 5 の場合、出力は True になります。これは、部分リスト [12, 3] を選ぶと合計が 15 となり、5 で割り切れるためです。 アルゴリズムの考え方 この問題は、累積和の剰余(mod k)を利用することで効率的に解けます。ポイントとなるのは次の性質です。 「2つの累積和の剰余が等しい場合、その間にある要素の合計は必ず k の倍数

  6. Pythonで合計が最大のk個の部分リストを見つけ、合計を昇順で返す方法

    問題概要数値のリスト nums と整数 k が与えられたとき、合計が最も大きくなる k 個の部分リスト(連続する要素からなる区間)を見つけ、その合計を昇順(非減少順)で返すことを考えます。たとえば、nums = [2, 4, 5, -100, 12, -30, 6, -2, 6]、k = 3 の場合、出力は [10, 11, 12] になります。これは、合計が大きい上位3つの部分リストがそれぞれ [6, -2, 6](合計10)、[2, 4, 5](合計11)、[12](合計12)であるためです。解法のアプローチこの問題は「累積和(prefix sum)」と「ヒープ」を組み合わせることで解くこ

  7. Pythonでチェスのナイトが目標位置に到達するまでの最小手数を求めるプログラム

    問題の概要 2つの値 r と c が与えられているとします。無限に広いチェス盤上で、ナイト(騎士)が最初に座標 (0, 0) に配置されているとき、そのナイトが位置 (r, c) に到達するまでに必要な最小の移動回数を求めます。 ナイトの動きは通常のチェスと同じで、「横に2マス・縦に1マス」または「縦に2マス・横に1マス」という移動を行います。 例えば、入力が r = 6、c = 1 の場合、出力は 3 となります。下図では、赤が初期位置、緑が最終位置、黄色が途中の経由地点を表しています。 解法のアプローチ この問題は、ナイトの移動パターンを数学的に分析することで、幅優先探索(BFS)の

  8. Pythonでチェスのナイトが盤内に留まり続ける確率を求めるプログラム

    n、x、y、k の4つの値が与えられたとします。n は n×n のチェス盤のサイズ、(x, y) はナイトが置かれている初期座標、k はナイトが正確に動く手数を表します。ナイトは各手ごとに、8方向のいずれかへ等しい確率でランダムに移動します。求めたいのは、k 手動いた後もナイトがチェス盤の中に留まっている確率(最も近い整数に丸めたパーセント値)です。ただし、一度でも盤の外に出てしまうと、その後は二度と盤に戻れないという条件があります。 例えば、入力が n = 8、(x, y) = (1, 1)、k = 1 の場合を考えてみましょう。8×8 のチェス盤の (1, 1) に置かれたナイトが、ちょ

  9. Pythonで二分木のノードとその子孫の最大絶対差を求めるプログラム

    問題概要 二分木が与えられたとき、任意のノードとその子孫との間の絶対差の最大値を求めることを考えます。 例えば、次のような二分木が入力として与えられた場合を考えてみましょう。 この場合、ノード8とノード1の間の差が最も大きくなるため、出力は 7 となります。 解法のアプローチ:DFSを使った追跡 この問題は、DFS(深さ優先探索)を用いることで効率的に解けます。各ノードについて「その部分木内の最小値」と「最大値」を追跡しながら、現在のノードの値との差を順次更新していくのがポイントです。 具体的な手順は以下の通りです。 dfs() 関数を定義します。引数としてノードを受け取ります。 ノード

  10. Pythonで2つの数値リストから最大距離ペアを求めるプログラム

    問題の概要同じ長さ n を持つ2つの数値リスト A と B が与えられているとします。このとき、すべての 0 ≤ i < j < n に対して、次の式の最大値を求める必要があります。|a[i] − a[j]| + |b[i] − b[j]| + |i − j|例えば、入力が A = [2, 4, 10, 6]、B = [3, 4, 7, 5] の場合、出力は 14 になります。これは i = 0、j = 2 のときに |2 − 10| + |3 − 7| + |0 − 2| = 8 + 4 + 2 = 14 となるためです。解法のアプローチすべてのペア (i, j) を総当たりで調

  11. Pythonで行列(グリッド)から最大の島の面積を求めるプログラム

    問題の概要 0と1のみで構成された2値行列を考えてみましょう。ここでは「1」が陸地、「0」が水を表しており、島とは水に囲まれた隣接する1の集まりを指します。行列の外側(端)もすべて水に囲まれているものと仮定し、その中で最も大きな島の面積(セルの数)を求めるのが今回の課題です。 例えば、以下のような入力が与えられたとします。 001111100000000111100001100000000110000010 この場合、最大の島は2〜3行目にまたがる6個の連結したセルで構成されているため、出力は6となります。 解法のアプローチ:DFS(深さ優先探索) この問題は、DFS(Depth First

  12. Pythonでリストをk回連結した配列の最大部分配列の合計を求める方法

    問題概要 数値のリスト nums と整数 k が与えられたとします。ここで k は、nums を k 回繰り返して連結した大きなリストを表します。この課題では、その大きなリストの中から「合計が最大となる連続する部分リスト」を見つけ、その合計を求める必要があります。 たとえば、入力が nums = [2, 4, 5, -4]、k = 1 の場合、出力は 11 になります。これは [2, 4, 5] という部分リストを選ぶことで、合計 2 + 4 + 5 = 11 が得られるためです。 解決のためのアプローチ この問題は、有名な「カダネのアルゴリズム(最大部分配列和)」を応用することで効率的に解

  13. Pythonで循環リスト内の隣接しない要素の最大合計を求めるプログラム

    問題の概要数値のリスト nums が与えられ、これが循環リスト(最初の要素と最後の要素がつながっているリスト)を表しているとします。この中から互いに隣接していない要素を選び、その合計の最大値を求めるのが目的です。例えば、入力が nums = [10, 3, 4, 8] の場合、出力は 14 になります。これは 10 と 4 を選べるためです。一方、10 と 8 は循環リスト上で隣接しているため、同時に選ぶことはできません。解法のアプローチ循環リストでは最初と最後の要素が隣接関係にあるため、そのまま通常の「隣接しない要素の最大和」問題として扱うことはできません。そこで、問題を次のように2つに分割

  14. Pythonでk個の塔を同じ高さに揃えるために必要な最小レンガ数を求めるプログラム

    問題の概要塔の高さが格納されたリストと正の整数 k が与えられたとします。この中から k 個の塔を選び、レンガを追加してすべて同じ高さに揃えたいと考えます。ただし、使用するレンガの数はできるだけ少なくしたいものです。ここでは、k 個の塔を選んで同じ高さにするときに必要となるレンガの最小数を求める方法を解説します。たとえば、heights = [5, 8, 32, 15, 41]、k = 3 という入力の場合、出力は 17 になります。これは、高さ 5、8、15 の3つの塔を選び、すべて高さ 15 に揃えると (15−5) + (15−8) + (15−15) = 17 個のレンガが必要になるた

  15. Pythonで2つの文字列の順列が辞書式順序の大小関係を満たすかどうかをチェックする方法

    問題の概要 同じ長さ n を持つ2つの文字列 s と t が与えられたとき、次の条件を満たすような順列(並べ替え)が存在するかどうかを判定します。 s のある順列 s1 と t のある順列 t1 について、すべての 0 ≤ i < n に対して s1[i] ≤ t1[i] が成り立つ、または すべての 0 ≤ i < n に対して t1[i] ≤ s1[i] が成り立つ つまり、「どちらか一方の文字列を並べ替えることで、もう一方の文字列に対して各位置で常に小さい(または等しい)状態にできるか」という問題です。 入力例 たとえば、s = vyx、t = wzx という入力の場合

  16. Pythonで辞書順最小の非回文文字列を求めるプログラムを解説

    問題の概要 回文(パリンドローム)である文字列 s が与えられます。このうちちょうど1文字を別の文字に置き換えて、結果が回文にならないようにし、かつその文字列が辞書順で最小になるようにします。 たとえば、入力が s = level の場合、出力は aevel になります。先頭の l を a に置き換えることで、回文ではなくなり、かつ辞書順で最小の文字列が得られるためです。 解き方のアプローチ 辞書順を最小にするには、できるだけ前方の位置の文字を、できるだけ小さい文字(a)へ置き換えるのが基本です。ただし、すでに a になっている文字を a に変えても文字列は変わりません。そこで、次の手順で処

  17. Pythonで点のリストが同一直線上にあるかどうかを判定するプログラム

    デカルト平面(XY座標平面)上の点のリストが与えられたとき、それらの点がすべて同一直線上に並んでいるかどうかを判定するプログラムを作成します。例えば、入力が coordinates = [(5, 5), (8, 8), (9, 9)] の場合、これら3つの点は傾き1の直線上に並んでいるため、出力は True になります。解法のアプローチすべての点が同一直線上にあるかどうかを確認するには、基準となる2点と他の各点との関係を調べます。具体的には、以下の手順で判定します。最初の2点を基準点として取り出します:(x0, y0) と (x1, y1)3番目以降の各点 (x, y) について、次の条件式を

  18. 【Python】連結リストから指定した値の最後の出現を削除する方法

    問題の概要 片方向連結リストと、削除対象となる値(target)が与えられたとき、リスト内で最後に出現するtargetだけを削除するプログラムを考えます。 たとえば、入力が [5,4,2,6,5,2,3,2,4,5,4,7]、target = 5 の場合、末尾側にある5(10番目の要素)を取り除くため、出力は [5, 4, 2, 6, 5, 2, 3, 2, 4, 4, 7] となります。 解法のアルゴリズム ポイントは、リストを前から順に走査しながら、「targetが見つかるたびに、その1つ前のノード」を変数に記録しておくことです。走査が終わった時点で残っている記録こそが、最後の出現位置の直

  19. Pythonで連結リストを「折りたたんで」マージするプログラムの実装方法

    問題の概要 連結リスト(Linked List)が与えられたとします。まずリストの前半を切り離し、それを後半に対して折り返すように重ね合わせます。そして、重なり合うノード同士の値を合計してマージし、最終的にできあがった連結リストの先頭ノード(head)を返します。 たとえば、入力が [5, 8, 1, 2, 4, 7, 5] の場合、出力は [2, 5, 15, 10] になります。 この例では、前半の「5, 8, 1」と後半の「4, 7, 5」が対応します(リスト長が奇数のため、中央のノード「2」はスキップされます)。折りたたみでは前半の末尾と後半の先頭がペアになるため、1+4=5、8+7=

  20. Pythonで2つのソート済み連結リストの交差(共通要素)を求めるプログラム

    問題の概要 2つのソート済み連結リスト(リンクリスト)L1 と L2 が与えられたとき、両方のリストに共通して含まれる要素だけからなる、新しいソート済み連結リストを作成することを考えます。これは、いわゆる「リストの交差」を求める問題です。 例えば、入力が L1 = [2, 4, 8]、L2 = [3, 4, 8, 10] の場合、両方のリストに存在する要素は 4 と 8 のみなので、出力は [4, 8] になります。 解き方のアプローチ 両方のリストがすでにソートされているため、各リストの先頭から2つのポインタを同時に進めていくことで、効率的に共通要素を抽出できます。具体的な手順は以下の通りで

Total 8994 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:189/450  20-コンピューター/Page Goto:1 183 184 185 186 187 188 189 190 191 192 193 194 195