PHPで実装するキューとスタック:配列と連結リストによるデータ構造の基礎

キュー(Queue)の基本概念 キューは先入先出(FIFO: First In, First Out)の原則に従う線形データ構造です。データの追加(エンキュー)は末尾でのみ行われ、データの削除(デキュー)は先頭でのみ行われます。PHPの組み込み関数を使用する場合、array_push() または配列の代入で末尾に要素を追加し、array_shift() で先頭の要素を削除することでキューの動作を再現でき ...

9月14日 11:19 投稿

強連通成分を利用したギフト再分配問題の解法

この問題は、各人が持っているギフトを特定のルールに基づいて交換し、最終的に各人がどのギフトを受け取れるかを決定するものです。 各人は、自分自身と、自分より左側にいる人たちのギフトを受け取ることができます。具体的には、各行の初期ギフト配置において、そのギフトを右隣のギフトと結びつける一方向のエッジを考えます。 このグラフ構造において、各ノード(人) ...

9月12日 03:37 投稿

正整数を互いに異なる自然数に分割し積を最大化するアルゴリズム

与えられた正整数 N を、互いに異なる複数の自然数に分解し、それらの自然数の積が最大となるようにする方法について解説します。分解された自然数は昇順で表示し、その最大積も計算・表示します。この問題は、効率的な貪欲法と高精度計算を組み合わせることで解決できます。 問題の概要 正整数 N (3 ≤ N ≤ 10000) が与えられます。N を互いに異なる自然数(ただし ...

9月10日 09:37 投稿

11月15日のアルゴリズム問題集追加

11/15 問題1: 二進数行列の最小反転回数 (3239) 解法はシミュレーションに基づく。 各行の反転回数を計算し、列方向の反転回数も同様に求めます。 int calcRowDiff(const vector& matrix) { int count = 0; for (const auto& row : matrix) { for (size_t i = 0; i < row.size() / 2; ++i) { if (row[i] != row[row.size()-1-i]) ++count; ...

9月9日 19:42 投稿

二つのソート済み配列から中央値を探索する

与えられた二つの昇順にソートされた配列 nums1(長さ m)と nums2(長さ n)から、これらを結合した際の中央値を特定する方法について解説します。 この問題の最適解は通常 O(log (m+n)) の時間計算量が求められますが、ここではまず、より直感的で実装しやすい O(m+n) のアプローチを紹介します。 問題の詳細と制約 配列 nums1 と nums2 はそれぞれ昇順にソートされてい ...

9月7日 01:37 投稿

貨積みの可否判定問題:棚の制約と配達順序

工場では、色番号1からNまでの異なる色の玉を各色1箱ずつ備蓄しており、作業員はそれらを決められた順序で出荷され、積み込む。作業員は以下の規則に従って作業を行う: 工場から運ばれてきた箱が、現在積み込みが必要な色(期待色)であれば、その箱を開封して直接積み込む。 そうでない場合、その箱を一時的な積み場(棚)の上に積み上げる。 ある色の積み込みが ...

9月4日 01:36 投稿

行列境界を縮小しながら螺旋状に行列要素を取得する手法

二次元配列の要素を時計回りの螺旋順で収集するアルゴリズムを解説します。主なアプローチとして、境界値を逐次更新する方法と、方向ベクトルと訪問済みフラグを利用する方法の2つを紹介します。 境界縮小方式(推奨) この手法では、未処理領域の上下左右の境界を保持し、外周を一周するたびに境界を内側に縮めます。各周回で4つの辺(上辺→右辺→下辺→左辺)を順に走査し ...

9月2日 03:08 投稿

二分探索木 (BST) の基礎と実装

二分探索木は以下の条件を満たすデータ構造です: 左の子ノードは親ノードより小さい。 右の子ノードは親ノードより大きい。 重要な点として、左側サブツリーの任意の値は、右側サブツリーのすべての値よりも小さいです。 探索効率 各ステップで半分の枝を削除できるため、非常に効率的です。パフォーマンスは木の深さとバランスに依存します。 ノードの定義 struct Tree ...

9月1日 20:15 投稿

グリッド迷路での最適経路探索

問題概要 n×m のグリッドからなる迷路を考えます。各セル (i, j) には方向指示 di,j と重み vi,j が設定されています。プレイヤーは初期位置 (sx, sy) から左足で踏み込み、その時点で vsx,sy を加算し、セルの重みを -vsx,sy に反転させます。 その後、各ステップで以下の選択肢があります: ゲームを終了し、現在のスコアを最終スコアとする 現在のセルの方向指示に従 ...

8月31日 20:47 投稿

基本的なアルゴリズム:離散化

離散化 #include <bits/stdc++.h> using namespace std; const int MAX_N = 1000010; int n, m; vector<int> originalValues; vector<int> addedValues; vector<int> startPos, endPos; vector<long long> diffArray; bool canProcess(int limit) { fill(diffArray.begin(), diffArray.end(), 0); for (int i = 0; i < li ...

8月29日 17:04 投稿