Python

 Computer >> コンピューター >  >> プログラミング >> Python
  1. Pythonで色リストを「赤→緑→青」の順に並べ替えるアルゴリズム(オランダ国旗問題の解法)

    「red」「green」「blue」といった色名の文字列が混在したリストがあるとします。このリストを、赤(red)が緑(green)より先に、緑が青(blue)より先に来るように並べ替えたいというのが今回の課題です。例えば、入力が colors = [blue, green, blue, red, red] の場合、出力は [red, red, green, blue, blue] となります。解法のアプローチこの問題は、有名なオランダ国旗問題(Dutch National Flag Problem)と同じ構造を持っています。3つのポインタを使ってリストを一度だけ走査し、その場で(in-pla

  2. Pythonで1回だけ出現する要素を見つける方法

    問題概要数値のリスト nums が与えられ、その中のすべての値はちょうど3回ずつ出現しますが、1つの値だけは1回しか出現しません。この「唯一の値」を見つけ出すのが課題です。例えば、入力が nums = [3, 3, 3, 8, 4, 4, 4] の場合、8だけが1回しか出現していないため、出力は 8 になります。解決のアプローチこの問題を解くには、以下の手順に従います。各値とその出現回数(頻度)を対応付けたマップを作成する頻度が最小の値(=1回しか出現していない値)を返すPythonでは collections.Counter を使うことで、要素の出現回数を簡単に数えることができます。あとは

  3. Pythonでリストの各要素より右側にある小さい要素の数を返すプログラム

    問題概要 数値のリスト nums が与えられたとします。このとき、元のリストの各要素について、その要素より右側に存在する小さい要素の個数を求め、それらを並べた新しいリストを作成する問題を考えてみましょう。 例えば、入力が nums = [4, 5, 9, 7, 2] の場合、出力は [1, 1, 2, 1, 0] になります。これは次のような理由によるものです。 4 の右側にある小さい要素は 1 個(2) 5 の右側にある小さい要素は 1 個(2) 9 の右側にある小さい要素は 2 個(7 と 2) 7 の右側にある小さい要素は 1 個(2) 2 の右側には小さい要素が存在しないため 0 個

  4. Pythonで最長アナグラム部分列の長さを求めるプログラム

    問題の概要小文字のみで構成された2つの文字列 S と T が与えられたとき、「最も長いアナグラム部分列」の長さを求めます。ここでアナグラム部分列とは、両方の文字列に共通して含まれる文字を組み合わせて作れる、同じ文字構成を持つ部分列のことです。例えば、S = helloworld、T = hellorld の場合、答えは 8 になります。これは、両方の文字列で共有できる文字(h ×1、e ×1、l ×3、o ×1、r ×1、d ×1)の合計が8文字であるためです。解法のアプローチこの問題は、各文字列における文字の出現回数を数え、その最小値を合計することで効率的に解けます。手順は以下の通りです。文

  5. Pythonで最長連続シーケンスの長さを求めるアルゴリズムと実装方法

    問題概要ソートされていない数値の配列が与えられたとき、その中から連続する要素で構成される最長シーケンスの長さを見つける問題を考えてみましょう。ここでいう「連続」とは、値が1ずつ増えていく数列(例:4, 5, 6, 7)のことを指します。例えば、入力が nums = [70, 7, 50, 4, 6, 5] の場合、最も長い連続シーケンスは [4, 5, 6, 7] となるため、答えは 4 になります。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。まず、配列をセット(set)に変換して重複を除去します。これにより、要素の存在確認が O(1) で行えるようになります。各要素

  6. Pythonで重複要素のない最長の連続部分リストの長さを求めるプログラム

    問題の概要数値のリスト nums が与えられたとき、すべての要素が一意(重複なし)であるような最長の連続する部分リストの長さを求めることを考えます。例えば、入力が nums = [6, 2, 4, 6, 3, 4, 5, 2] の場合、出力は 5 になります。これは、重複のない要素からなる最長の部分リストが [6, 3, 4, 5, 2] だからです。解き方:スライディングウィンドウ法この問題は「スライディングウィンドウ(尺取り法)」と呼ばれる手法で効率的に解けます。基本的な考え方は以下の通りです。ウィンドウの左端を指す head を 0 で初期化し、各要素の最後に出現したインデックスを記録す

  7. Pythonで最大K回のインクリメント操作後に等しい要素からなる最長部分リストを求めるプログラム

    問題の概要数値のリスト nums と整数 k が与えられます。「リスト内の任意の1つの要素を1だけ増やす」という操作を最大 k 回まで行えるとき、すべての要素が等しい値になるような最長の部分リスト(連続する部分列)の長さを求めます。たとえば、入力が nums = [3, 5, 9, 6, 10, 7]、k = 6 の場合を考えてみましょう。9 を1回、6 を4回インクリメントすれば、部分リスト [10, 10, 10] が作れるため、答えは 3 になります。解法のステップこの問題は、スライディングウィンドウと単調デック(モノトニックデック)を組み合わせることで効率的に解けます。手順は以下のとお

  8. 【Python】二分木で偶数値のみからなる最長パスを求めるアルゴリズムと実装

    問題概要 二分木が与えられたとき、木の中の任意の2つのノードをつなぐ経路のうち、偶数の値のみで構成される最長のパスの長さを見つけることを考えます。 例えば、次のような二分木が入力として与えられた場合を考えてみましょう。 この場合、最長のパスは [10, 2, 4, 8, 6] となるため、出力は 5 になります。 解法のアプローチ この問題は、再帰的な深さ優先探索(DFS)を使うことで効率的に解くことができます。各ノードについて「左部分木から伸びる偶数パスの長さ」と「右部分木から伸びる偶数パスの長さ」を求め、それらを組み合わせて全体の答えを更新していくのがポイントです。 具体的には、以下の

  9. Pythonで最長増加部分列(LIS)の長さを求めるプログラム【二分探索でO(n log n)】

    数値のリストが与えられたとき、その中から最長増加部分列(LIS: Longest Increasing Subsequence)の長さを求める問題を考えます。たとえば、入力が [6, 1, 7, 2, 8, 3, 4, 5] の場合、最長増加部分列は [2, 3, 4, 5, 6] となるため、答えは 5 になります。本記事では、単純な動的計画法(O(n²))よりも高速な、二分探索を組み合わせた O(n log n) のアルゴリズムをPythonで実装する方法を解説します。アルゴリズムの手順nums と同じサイズの配列 tails を用意し、すべての要素を 0 で初期化します。size :=

  10. Pythonで最も長い交互不等式サブリストの長さを求めるプログラム

    問題の概要 数値のリスト nums が与えられます。ここで求めたいのは、隣り合う数値どうしの大小関係(不等号)が「<(小なり)」と「>(大なり)」の間で交互に入れ替わるような、最も長いサブリストの長さです。なお、最初の2つの数値の大小関係は、小なり・大なりどちらから始めても構いません。 たとえば、入力が nums = [1, 2, 6, 4, 5] のとき、答えは 4 になります。これは、最も長い交互不等式サブリストが [2, 6, 4, 5] であり、2 < 6 > 4 < 5 というように不等号が交互に成立しているためです。 この種の上下に波打つ並びは「ジグザ

  11. Pythonで最長の回文(パリンドローム)部分文字列の長さを求めるプログラム

    文字列 S が与えられたとき、S の中に含まれる最長の回文(パリンドローム)部分文字列の長さを求めることを考えます。ここでは、文字列の長さは最大1000程度であると仮定します。 たとえば、文字列が「BABAC」の場合、最長の回文部分文字列は「BAB」となり、その長さは 3 です。 解法のアプローチ:動的計画法(DP) この問題は、動的計画法を用いることで効率的に解けます。基本の考え方は、「ある範囲の部分文字列が回文であるかどうか」を小さい部分問題から順に記録していくというものです。 アルゴリズムの手順 文字列の長さと同じサイズの正方行列(2次元配列)dp を定義し、すべて False で初期

  12. Pythonで「最小値×2>最大値」を満たす最長の部分リストの長さを求めるプログラム

    数値のリスト nums が与えられたとき、「部分リスト内の最小値 × 2 > 部分リスト内の最大値」という条件を満たす、最長の連続した部分リスト(サブリスト)の長さを求める問題を考えてみましょう。たとえば、nums = [10, 2, 6, 6, 4, 4] という入力の場合、出力は 4 になります。これは、部分リスト [6, 6, 4, 4] が「2 × 4 > 6」という条件を満たす最長の部分リストだからです。解法のアプローチ:スライディングウィンドウと単調両端キューこの問題は、スライディングウィンドウ(尺取り法)と単調な両端キュー(deque)を組み合わせることで効率的に解けます。各時点

  13. Pythonで最大2種類の異なる文字を含む最長部分文字列の長さを求める方法

    問題概要 文字列 s が与えられたとき、「異なる文字が最大2種類しか含まれない最長の部分文字列」の長さを求めることを考えます。 例えば、入力が s = xyzzy の場合、出力は 4 になります。これは「yzzy」が y と z の2種類の文字のみを含む最長の部分文字列だからです。 解き方:スライディングウィンドウ この問題は「スライディングウィンドウ(尺取り法)」と呼ばれる手法を使うことで効率的に解けます。各文字の出現回数を記録するマップ(Counter)を用意し、ウィンドウ内の異なる文字の種類数が2を超えないように、左端を調整しながら右端を伸ばしていきます。 具体的な手順は以下の通りで

  14. Pythonで二分木の根から葉までの最長経路の合計値を求めるプログラム

    二分木が与えられたとき、根(ルート)から葉ノードまでの最長経路におけるノード値の合計を求める問題を考えます。同じ長さの経路が複数存在する場合は、その中で合計値が大きい方の経路を採用します。たとえば、次のような二分木が入力として与えられた場合を考えてみましょう。この場合、出力は 20 になります。解き方のアプローチこの問題は、再帰を使って各ノードから「深さ」と「合計値」のペアを返すことで解けます。手順は以下の通りです。関数 rec() を定義します。引数として現在のノード curr を受け取ります。curr が null(空)の場合は、ペア (0, 0) を返します。bigger := 左の子に

  15. Pythonで二分木の最小共通祖先(LCA)を求めるアルゴリズムと実装例

    はじめに二分木と2つの数値 a、b が与えられたとき、a と b を子孫として持つ最も深いノード(最小共通祖先:LCA)の値を求める問題を考えてみましょう。ここで重要なポイントは、「あるノードはそれ自身の子孫にもなり得る」という点です。つまり、片方のノードがもう片方の祖先である場合、そのノード自体が答えになります。例以下のような二分木を考えます。このとき、a = 6、b = 2 とすると、出力は 4 になります。値4のノードが、6と2の両方を子孫として持つ最も深いノードだからです。解法のアプローチこの問題は再帰を使って効率的に解くことができます。手順は以下の通りです。solve() メソッドを

  16. Pythonで文字列を回文にするために必要な最小挿入文字数を求めるプログラム

    問題の概要 文字列 s が与えられたとき、その文字列を回文(前から読んでも後ろから読んでも同じになる文字列)にするために、最低何文字を挿入する必要があるかを求める問題です。 例えば、s = mad の場合、出力は 2 になります。「am」を挿入して「madam」にすれば回文になるためです。 解決のアプローチ この問題は、区間ごとに状態を管理する再帰的な動的計画法(DP)で効率よく解けます。以下の手順で考えます。 dp(i, j) という関数を定義します。これは、部分文字列 s[i..j] を回文にするために必要な最小挿入文字数を返します。 i >= j の場合(部分文字列が空、または

  17. 【Python】サブリストの合計操作で2つのリストを一致させるプログラムの実装方法

    問題の概要 2つのリスト l1 と l2 が与えられます。次の操作を何度でも繰り返し適用して、両方のリストを完全に一致させることを考えます。 操作: 連続する要素からなる部分リスト(サブリスト)を1つ選び、その部分リスト全体を要素の合計値1つで置き換える。 操作を適用した結果として作れるリストのうち、最も長くなるリストのサイズを返してください。どうしても一致させられない場合は -1 を返します。 入力例と動作イメージ たとえば l1 = [1, 4, 7, 1, 2, 10]、l2 = [5, 6, 1, 3, 10] の場合、答えは 4 になります。以下の手順で操作すると、両方のリスト

  18. Pythonで指定金額を作るために必要な最小コイン枚数を求めるプログラム

    異なる額面(1、5、10、25)のコインと合計金額 amount が与えられたとき、その金額をちょうど作るために必要な最少のコイン枚数を計算する関数を定義します。たとえば入力が 64 の場合、出力は 7 になります。これは 25 + 25 + 10 + 1 + 1 + 1 + 1 = 64 という組み合わせで構成できるためです。 解法のアプローチ この問題は動的計画法(DP)を使うことで効率的に解けます。「dp[i] = 金額 i を作るのに必要な最小コイン枚数」と定義し、小さい金額から順に値を埋めていきます。具体的な手順は以下の通りです。 amount が 0 の場合は 0 を返す コ

  19. Pythonで指定されたコインのセットから目標金額を作るために必要な最小コイン枚数を求めるプログラム

    問題の概要異なる額面のコインのリストと合計金額(amount)が与えられたとき、その金額をちょうど作るために必要なコインの最小枚数を計算する関数を定義します。どのようなコインの組み合わせを使ってもその金額を作れない場合は、-1 を返します。例えば、コインのリストが [1, 2, 5]、金額が 64 の場合、出力は 14 になります。これは「5 を 12 枚 + 2 を 2 枚」= 12×5 + 2 + 2 = 64 という組み合わせで実現できるためです。解法のアプローチ:動的計画法(DP)この問題は動的計画法を使うことで効率的に解けます。「dp[i] = 金額 i を作るために必要な最小コイン

  20. Pythonで隣接ペアの合計をk以下に抑えるための最小操作回数を求めるプログラム

    問題概要 負でない数値のリスト nums と、負でない整数 k が与えられます。ここで、「リスト内の正の数を1つ選び、その値を1だけ減らす」という操作を何度でも行えるものとします。すべての隣接する要素のペアの合計が k 以下になるようにするために必要な最小の操作回数を求めてください。答えが非常に大きくなる可能性がある場合は、結果を 10^9 + 7 で割った余りを返します。 たとえば、入力が nums = [4, 6, 2, 5]、k = 6 の場合、出力は 5 になります。これは、リストを [3, 3, 1, 4] に変形すれば、合計5回の減算操作ですべての隣接ペアの合計が 6 以下に収まる

Total 8994 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:178/450  20-コンピューター/Page Goto:1 172 173 174 175 176 177 178 179 180 181 182 183 184