二次元グリッドの最小経路を求める動的計画法の実装

問題の概要 左上のセル (0, 0) から右下のセル (m-1, n-1) まで、右または下のみ移動して到達する経路のうち、通過したセルの値の合計が最小となるものを求めます。 DP の定式化 dp[i][j] を「(i, j) まで到達する経路の最小値」とします。到達できる移元は上方向か左方向のみなので、次の漸化式が成り立ちます。 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j] ...

10月12日 23:10 投稿

LeetCode 350: 二つの配列の共通要素(ハッシュマップと双方向ポインタ)

問題概要:350. 二つの配列の交差 与えられた二つの整数配列から、両方に含まれる要素を重複を考慮して返す。各要素の出現回数は、両方の配列で最小となる回数に制限される。 手法1: ハッシュマップによるカウント 一方の配列の要素とその頻度をハッシュマップに保存し、もう一方の配列を走査しながら該当する要素があれば結果リストに追加し、頻度を減算する。 時間計算 ...

9月29日 03:46 投稿

回溯法による組合せ問題の解法:理論からLeetCode 77まで

回溯法の基本概念 回溯法(Backtracking)は、探索空間を系統的に調べるアルゴリズム手法です。再帰と密接に関連しており、再帰的な探索過程で「戻る」操作を含むため、この名前が付いています。 この手法の核心は全探索にあります。問題の制約条件を満たすすべての解を列挙し、その中から目的のものを選び出します。効率化のために枝刈り(Pruning)を組み合わせること ...

9月6日 04:10 投稿

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

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

9月2日 03:08 投稿

三日挑战|203.リストから要素を削除、707.リストの設計、206.リストの反転

LeetCode 203. リストから要素を削除 問題リンク:203. Remove Linked List Elements 以下の3つのポイントに注意する: ヘッドノードが値を持つ場合、その値が削除対象と一致するか確認し、一致すればヘッドを更新する。 ノードを削除する際は、まず次のノードへのリンクを設定してから削除を行う。 メモリのオーバーフローを避ける。 以下のように、現在のノードの次の ...

8月26日 16:02 投稿

LeetCode | 面試問題 08.01. 三步問題

関連タグ 動的計画法、C言語 問題の説明 三段階の階段を登る問題です。ある子供が階段を登っているとします。階段はn段あり、その子供は一度に1段、2段、または3段を登ることができます。このとき、子供が階段を登る方法の総数を計算するアルゴリズムを実装してください。結果は非常に大きくなる可能性があるため、1000000007で剰余を取ってください。 解法の考察 これは基 ...

8月23日 07:43 投稿

配列から和がゼロになる3つの要素の組み合わせを求めるアルゴリズム

問題概要 整数配列 numbers が与えられたとき、異なる3つの要素 numbers[i] + numbers[j] + numbers[k] == 0 を満たすすべての一意な三元組 (i, j, k) を見つけて返します。ただし、i, j, k はすべて異なるインデックスを指す必要があります。 制約条件 配列の長さ: 3 ≤ numbers.length ≤ 3000 要素の範囲: -10⁵ ≤ numbers[i] ≤ 10⁵ 実行例 入力: numbers = [-1, 0, 1, ...

8月21日 22:50 投稿

リンクリストの基本操作:要素削除・設計・反転をC言語で徹底解説

1. 問題203:リンクリストの特定要素削除 // ヘッダノードを使用しない実装(移動操作で削除) struct ListNode* removeElements(struct ListNode* head, int val) { // 先頭ノードが削除対象の場合 while (head != NULL && head->val == val) { head = head->next; } // 先頭以外のノードを削除 struct ListNode* current = head; while ...

8月9日 12:37 投稿

行列の対角線上の異なる値の数の差を計算するアルゴリズム

問題概要 m × n のサイズの二次元行列 grid が与えられます。同じサイズの解答行列 answer を作成する必要があります。 行列 answer の各セル (r, c) の値は以下のように計算されます: topLeft[r][c] は行列 grid のセル (r, c) の左上対角線上にある異なる値の数です。 bottomRight[r][c] は行列 grid のセル (r, c) の右下対角線上にある異なる値の数です。 そして an ...

8月8日 01:49 投稿

LeetCode 57: ソート済み区間リストへの新規追加と統合処理

課題の概要 互いに重複しない(overlapping な)区間のセットが、開始時間に基づいて昇順にソートされた状態で与えられます。このセットに対して、指定された新しい区間を挿入し、必要に応じて既存の区間と統合(マージ)して返すことが求められます。 結果も同様に重複せず、開始時間でソートされている状態である必要があります。 思考プロセス この問題を解決する鍵は ...

8月6日 10:00 投稿