-
Pythonで乱数を含む無限連根式の期待値を求めるプログラム
問題の概要 整数 n が与えられているとします。ここで、x = rand() mod n と定義します。rand() は 0 以上 10^100 以下の整数を一様な確率で生成する関数です。さらに、次のような無限に入れ子になった平方根(連根式)を考えます。 $$Y = \sqrt{x+\sqrt{x+\sqrt{x+\sqrt{x+...}}}}$$ このとき、Y の期待値を求めるのが課題です。n は 1 以上 5×10^6 以下の範囲にあるものとします。 たとえば、入力が n = 5 の場合、出力は 1.696 になります。 解法のアイデア:閉じた形への変換 一見すると果てしなく続く式ですが
-
【Python】特定の時点で交差している区間の数をカウントする方法
区間のリストと、point という値が与えられているとします。各区間 interval[i] は [si, ei] の形式で表され、区間 i の開始時刻と終了時刻(両端を含む)を意味します。このとき、指定された時点で交差している区間の個数を求める必要があります。 たとえば、入力が intervals = [[2, 6],[4, 10],[5, 9],[11, 14]]、point = 5 の場合、出力は 3 になります。これは、時刻 5 を含む区間が [2, 6]、[4, 10]、[5, 9] の 3 つ存在するためです。 解決アプローチ この問題は、シンプルな線形探索によって解くことができま
-
Pythonで最も視聴された上位K番組の合計視聴時間を求めるプログラム
文字列のリスト shows、整数のリスト durations、そして値 k が与えられたとします。shows[i] と durations[i] は、i 番目の人が視聴した番組名とその視聴時間を表しています。このとき、最も視聴された上位 k 件の番組について、合計視聴時間を求めるのがこの問題の目的です。 例えば、入力が次のような場合を考えてみましょう。 shows = [The BGT, Jack jumper, The BGT, Jokers Company, Music magic] durations = [10, 8, 10, 18, 9] k = 2 この場合の出力は 38 にな
-
【Python】不公平度が最小となる長さkの部分配列を見つけるアルゴリズム
問題の概要 配列 A と整数 k が与えられたとき、A から要素を取り出してサイズ k の配列 arr を作成し、「不公平度」と呼ばれる指標を最小化することを考えます。不公平度は次の式で計算されます。 ( arr の最大値 ) − ( arr の最小値 ) たとえば、入力が A = [25, 120, 350, 150, 2500, 25, 35]、k = 3 の場合を考えてみましょう。このとき [25, 25, 35] を選べば、max(arr) = 35、min(arr) = 25 となり、その差は 10 になります。これより小さい差を実現できる組み合わせは存在しないため、答えは 10
-
Pythonで「値がk以上の要素がちょうどk個」成立するkを見つける方法
非負の整数のみを含むリスト nums が与えられます。この中から、「k 以上の値を持つ要素がちょうど k 個存在する」ような整数 k を見つけて返すことを考えます。条件を満たす k が存在しない場合は -1 を返します。たとえば、入力が nums = [6, 4, 0, 8, 2, 9] の場合を考えてみましょう。4 以上の値を持つ要素は [6, 4, 8, 9] のちょうど 4 個であるため、答えは 4 になります。解法の考え方この問題は、リストを降順にソートすることで効率的に解けます。降順ソート後のリストでは、インデックス i より前にある要素はすべて nums[i - 1] 以上の値を持
-
Pythonで二値行列の基準を満たす要素の個数を求めるプログラム
0と1だけで構成される二値行列が与えられたとき、次のルールを満たす要素の個数を求める問題を考えてみましょう。matrix[r, c] = 1 であるr行目の他のすべての列 j(j ≠ c)について matrix[r, j] = 0 であり、かつ c列目の他のすべての行 i(i ≠ r)について matrix[i, c] = 0 である簡単に言えば、「そのセルが1であり、同じ行にも同じ列にも他の1が存在しない」ようなセルの数を数えるというものです。たとえば、次のような入力を考えます。001100010この場合の出力は 3 になります。条件を満たしているのはセル (0,2)、(1,0)、(2,1)
-
Pythonで配列式 values[i] + values[j] + nums[j] − nums[i] を最大化する値を求めるプログラム
問題の概要 整数を要素とする2つの配列 nums と values が与えられます。nums の要素は厳密に増加(狭義単調増加)しており、2つの配列の長さは同じです。 このとき、i ≤ j を満たすインデックスの組 (i, j) に対して、次の式で定義される値 v を考えます。 v = values[i] + values[j] + nums[j] − nums[i] この v を最大化する値を求めるのが本記事のゴールです。 入力例 nums = [1, 2, 7] values = [-4, 6, 5] i = 1、j = 2 を選ぶと、計算は次のようになります。 6 + 5 + 7 −
-
Pythonで最大k回の符号反転操作を行い配列の合計を最大化する方法
リスト nums と整数 k が与えられたとします。ここで考える操作とは、nums から要素を1つ選び、その符号を反転させるものです。この操作をちょうど k 回実行したとき、得られる合計値の最大値を求めます。 例えば、入力が nums = [2, 1, -6, -2]、k = 3 の場合、出力は 9 になります。-6、-2、そして 1 の符号を反転すると [2, -1, 6, 2] となり、その合計は 9 になるためです。 解法のアプローチ この問題は「貪欲法」を使って効率的に解くことができます。手順は以下の通りです。 n を nums のサイズとします。 n が 0 の場合は 0 を返し
-
Pythonで辞書式順序が最大の山型リストを求めるプログラム
問題の概要正の整数 n、lower、upper の3つが与えられたとします。このとき、次の条件をすべて満たすリストを考えます。長さがちょうど n である前半は狭義単調増加、後半は狭義単調減少という「山」の形状になっているすべての要素が範囲 [lower, upper](両端を含む)に収まっている増加部分と減少部分がどちらも空ではないこれらの条件を満たすリストの中から、辞書式順序で最も大きなものを1つ求めてください。条件を満たすリストが存在しない場合は、空のリストを返します。たとえば n = 5、lower = 3、upper = 7 のとき、答えは [6, 7, 6, 5, 4] となります。
-
Pythonでn人の列における自分の位置候補数を求めるプログラム(前方最低a人・後方最大b人の条件)
3つの整数 n、a、b が与えられたとします。n 人の人々が一列に並んでおり、その中に自分も含まれています。しかし、自分が何番目にいるのかは分かりません。分かっているのは、前方には少なくとも a 人、そして後方には最大で b 人の人がいるということだけです。この条件を満たす自分の位置として考えられるパターンが何通りあるかを求めるのが問題です。入力例と出力例たとえば n = 10、a = 3、b = 4 が入力された場合、出力は 5 になります。これは、列全体が10人で、前方に少なくとも3人、後方に最大4人がいる状況です。このとき、自分の位置は先頭を0番目として 0、1、2、3、4 のいずれかに
-
MatplotlibでX軸に正しい周波数を表示して信号のFFTをプロットする方法
matplotlibで信号のFFT(高速フーリエ変換)をプロットする際、X軸に正しい周波数を表示することは非常に重要です。ここでは、numpyのnp.fft.fftとnp.fft.fftfreqを組み合わせて、正確な周波数軸を持つFFTスペクトルを作成する方法を解説します。 手順 図のサイズを設定し、サブプロット間および周囲のパディングを調整します。 2つの変数 N(サンプル数)と m(サイクル数)を初期化し、nu(正規化された周波数)を計算します。 numpyを使って信号(正弦波)を作成し、1次元離散フーリエ変換を計算します。 np.fft.fftfreqで離散フーリエ変換のサンプル周波数
-
Pythonで先頭文字が同じ単語が連続する最長サブリストの長さを求める方法
問題の概要 小文字のアルファベットで構成された文字列のリスト words が与えられたとします。この中から「隣り合う単語の先頭文字がすべて同じである」最も長い連続するサブリスト(部分リスト)を見つけ、その長さを求めるのが今回の課題です。 たとえば、入力が [she, sells, seashells, on, the, sea, shore] の場合、出力は 3 になります。最も長い連続サブリストは [she, sells, seashells] であり、これらの単語の先頭文字はすべて s で共通しているためです。 解決のアプローチ この問題は、リストを一度だけ走査しながら「現在の連続カウン
-
Pythonで最大k回の置換により同じ数が並ぶ最長の部分リストの長さを求める方法
問題概要 リスト nums と整数 k が与えられたとします。ここで「1回の操作」とは、リスト内の任意の要素の値を別の値に書き換えることを指します。最大 k 回までの操作を行った後、同じ数が繰り返し並んでいる 最長の部分リスト(連続する区間)の長さを求めるのが目的です。 入力例 たとえば、nums = [8, 6, 6, 4, 3, 6, 6]、k = 2 が入力された場合、出力は 6 になります。 理由は次のとおりです。値 4 と 3 を 6 に書き換えることで、配列は [8, 6, 6, 6, 6, 6, 6] となり、すべてが 6 で構成される部分リストの長さは 6 になります。 解
-
Python Matplotlibで曲線グラフにタイトルを付ける方法
PythonのMatplotlibで曲線のグラフにタイトルを表示するには、plt.title()メソッドを使用します。この記事では、曲線を描画してタイトルを付けるまでの基本的な手順を、サンプルコード付きでわかりやすく解説します。 実装の手順 図(figure)のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。 描画した線が曲線になるように、x および y のデータポイントを作成します。 作成した x と y のデータポイントをプロットします。 plt.title() メソッドを使って、曲線のグラフにタイトルを設定します。 plt.show() メソッドを呼び出して、
-
Pythonで2次元累積和(接頭辞和)行列を求める方法:各要素が左上領域の合計になる行列の作り方
問題の概要 ある行列が与えられたとき、同じサイズを持つ新しい行列 res を求めることを考えます。この新しい行列の各要素は、次のように定義されます。 res[i][j] = 元の行列における matrix[r][c] の合計(ただし r ≤ i かつ c ≤ j を満たすすべての要素) つまり、各位置 (i, j) には「その位置から見て左上側にあるすべての要素の合計」が入ります。これはいわゆる2次元累積和(Prefix Sum)と呼ばれる手法で、画像処理や動的計画法など、さまざまな分野で活用される重要なテクニックです。 入力例 82 74 出力例 810 1521 例えば
-
MatplotlibでPandasデータフレームの時刻をインデックス値としてプロットする方法
MatplotlibでPandasデータフレームの時刻(タイムスタンプ)をインデックス値として扱い、時系列グラフを描くには、set_index()メソッドを使って時刻列をインデックスに設定するのが最も簡単な方法です。以下に具体的な手順とコード例を示します。 実装手順 rcParamsを使って図のサイズを設定し、サブプロット間および周囲の余白(パディング)を自動調整します。 time(時刻)とspeed(速度)の2つの列を持つPandasデータフレームを作成します。時刻にはpd.date_range()を使って一定間隔のタイムスタンプを生成します。 set_index(time)で既存の「ti
-
Pythonでバイナリ文字列を2つに分割して最大スコアを求める方法
問題概要バイナリ文字列 s が与えられているとします。ここで、文字列を2つの空でない部分文字列 s1 と s2 に分割する操作を考えます。この分割の「スコア」は、s1 に含まれる「0」の個数と、s2 に含まれる「1」の個数の合計として定義されます。目的は、この操作によって得られる最大のスコアを求めることです。例えば、入力が s = "011001100111" の場合、出力は 8 になります。これは、文字列を "01100" + "110111" のように分割すると、左側に「0」が3個、右側に「1」が5個含まれるため、スコアは 3 +
-
MatplotlibでX軸の目盛りラベル(xtickラベル)をボックスで囲む方法
Matplotlibでは、set_bbox()メソッドを使うことで、X軸の目盛りラベル(xtickラベル)に背景色や枠線を持つボックスを簡単に追加できます。グラフを見やすく装飾したい場合に便利なテクニックです。実装手順新しい図(figure)を作成するか、既存の図をアクティブにします。plt.gca() を使って、図の現在の軸(axis)を取得します。X軸とY軸の目盛りの位置をそれぞれ「bottom」と「left」に設定します。スパイン(軸線)の位置を設定します。ここでは、下と左のスパインをデータ座標0の位置に配置します。xtickラベルをボックスで囲むために、get_xticklabels(
-
Matplotlibでアニメーション画像マトリックスをプロットする方法
Matplotlibを使ってアニメーション付きの画像マトリックスをプロットするには、FuncAnimationを活用するのが便利です。以下の手順で実装できます。 実装手順 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。 plt.subplots()を使って、図とサブプロットを作成します。 update関数を繰り返し呼び出すことで、アニメーションを生成します。 updateメソッド内では、6×6の行列データを生成し、imshow()を使って2次元のラスタ画像として表示します。 set_axis_off()を呼び出して、軸を非表示にします。 最後にshow()メソ
-
matplotlibで極座標プロットにマイナーティック(補助目盛り)を追加する方法
matplotlibで極座標プロット(ポーラープロット)にマイナーティック(補助目盛り)を作成するには、外周部分に短い線分を描画する方法が有効です。この記事では、その具体的な手順をコード例とともに解説します。 実装手順 図のサイズを設定し、サブプロット間および周囲のパディングを調整します。 numpyを使用して、半径(r)と角度(theta)のデータポイントを作成します。 現在の図にサブプロットを追加します。 0度から360度までstep=10でポイントを反復処理し、目盛りとして描画します。 show()メソッドを使用して図を表示します。 コード例 import numpy as np i