動的プログラミングによる問題解決:フィボナッチ数、階段の登り方、最小コストでの階段登り

動的プログラミング問題へのアプローチ 動的プログラミング問題を解決するための5つのステップ: DP配列(DPテーブル)とそのインデックスの意味を定義する 漸化式を決定する DP配列の初期化方法を決定する(配列オーバーフローに注意) 計算順序を決定する DP配列の具体例を導出する フィボナッチ数 フィボナッチ数列(通常 F(n) で表される)は、0 と 1 から始まり、そ ...

6月24日 21:13 投稿

LeetCode問題:最小反転操作回数

問題 2612. 最小反転操作回数 整数 n と、範囲 [0, n - 1] 内の整数 p が与えられます。これらは、長さが n でインデックスが 0 から始まる配列 arr を表します。この配列では、インデックス p の位置だけが 1 で、他のすべての要素は 0 です。 同時に、整数配列 banned も与えられます。この配列には、配列内のいくつかの位置が含まれています。banned の第 i 個 ...

6月13日 20:44 投稿

Javaで学ぶリンクリストの基本操作とアルゴリズム

本日の課題 LeetCode 203. リンクリスト要素の削除 LeetCode 707. リンクリストの設計 LeetCode 206. リンクリストの反転 基本概念の整理 ノードの追加処理では、新しいノード(current.next)を先に処理し、古いノード(previous.next)を後から処理します。 ノードの削除では、現在のノードを削除するには、その前のノードを知る必要があります。そのため、currentとp ...

6月11日 21:03 投稿

LeetCodeスライディングウィンドウパターン徹底解説

スライディングウィンドウ入門 「連鎖・部分文字列・配列の問題は、まず双方向ポインタを考えよ。 双方向ポインタ三兄弟、それぞれに魅力あり。 速いポインタと遅いポインタは魔法使い、連結リスト操作に敵なし。 マージソートで中点を探し、連結リストの循環を判定。 左右ポインタが最も一般的、配列の両端から中央へ。 反転配列にはこれを頼れ、二分探索は弟分。 スライ ...

6月8日 18:46 投稿

最長有効括弧の探索:スタックと動的計画法によるアプローチ

問題の説明: '(' と ')' のみからなる文字列が与えられます。最長の有効な(形式が正しく連続している)括弧部分文字列の長さを見つけてください。 例 1: 入力:s = "(()" 出力:2 説明:最長の有効な括弧部分文字列は "()" です 例 2: 入力:s = ")()())" 出力:4 説明:最長の有効な括弧部分文字列は "()()" です 例 3: 入 ...

6月4日 17:25 投稿

LeetCodeの代表的なアルゴリズム問題とその解答

LeetCodeの代表的なアルゴリズム問題とそのC++による実装をまとめました。文字列、配列、連結リスト、動的計画法などのトピックを取り上げ、アルゴリズム面接準備や日頃の練習に役立ちます。 目次 文字列処理 配列問題 連結リスト操作 動的計画法 木の走査 1. 文字列処理 1.1 二進数の部分文字列を数える(Count Binary Substrings) 問題説明:与えられた文字列において ...

6月2日 16:49 投稿

回文部分文字列と回文部分列の動的計画法による解法

回文部分文字列のカウント この問題の難しさは、DP配列の定義と漸化式の構築にあります。直接dp[i]を[0,i]の部分文字列に含まれる回文の数と定義すると、漸化式を見つけることができません。回文の性質を利用して、次のような漸化式を構築できます:[i,j]が回文かどうかを判断するために、s[i] == s[j]の場合は[i+1,j-1]が回文かどうかを確認するだけで済みます。s[i] != s ...

6月1日 11:09 投稿

LeetCode 第358回週間コンテスト 解説

2815. 配列内の最大ペア和 二重ループで全探索する。 class Solution { public: int maxSum(vector<int>& nums) { auto getMaxDigit = [](int val) { int maxD = 0; while (val) { if (val % 10 > maxD) maxD = val % 10; val /= 10; } return maxD; } ...

5月31日 03:48 投稿

二分探索木の有効性検証:中間順走査によるアプローチ

問題の概要 二分探索木(BST)が有効であるかどうかを判定するには、各ノードが以下の条件を満たしているかを確認する必要があります。 ノードの左部分木に含まれるすべての値は、そのノードの値より厳密に小さい。 ノードの右部分木に含まれるすべての値は、そのノードの値より厳密に大きい。 左右の部分木もそれぞれ二分探索木でなければならない。 これを効率的にチェ ...

5月29日 04:49 投稿

双指针アルゴリズムによる合計問題の解法

2つの数の合計が特定の値になる場合 配列がソートされている場合、双指針法を用いて効率的に解決できます。左端と右端から開始し、合計値を比較してポインタを移動します。 public class SumSolution { public static int[] findTwoSum(int[] arr, int target) { int start = 0; int end = arr.length - 1; while (start < end) { ...

5月28日 13:34 投稿