最長共通部分列の解法

最長共通部分列 2つの文字列 s1 と s2 が与えられたとき、これらの文字列の最長共通部分列の長さを返してください。共通部分列が存在しない場合は 0 を返します。 文字列の部分列とは、元の文字列から文字の相対的な順序を変更せずに一部の文字を削除(または削除しない)して形成される新しい文字列です。 例えば、"ace" は "abcde" の部分列です ...

8月3日 19:44 投稿

LeetCode バイウィークリーコンテスト 第111回 解説

問題2824: 目標値より小さい和を持つインデックスペアの数え上げ この問題は、全ての可能なペアを列挙して条件を満たすものをカウントするだけで解決できます。 class Solution { public: int countPairs(vector<int>& values, int target) { int length = values.size(); int result = 0; for(int i = 0; i + 1 < length; i++) { ...

8月2日 18:56 投稿

スライディングウィンドウ(Sliding Window)アルゴリズムのパターンと実装まとめ

非固定長スライディングウィンドウのテンプレート public int variableWindow(int[] nums) { Map<Integer, Integer> state = new HashMap<>(); // 適切なデータ構造を選択 int start = 0; int maxLen = 0; for (int end = 0; end < nums.length; end++) { // ウィンドウを拡大 // nums[end] を state に O(1) で追加 ...

7月26日 16:34 投稿

アルゴリズムトレーニングキャンプ第11日:有効な括弧(LeetCode 20)

20. 有効な括弧 この問題は、与えられた文字列の括弧が有効かどうかを判断する必要があります。有効な括弧の定義は、全ての開き括弧に対応する閉じ括弧があり、正しい順序と埋め込みになっていることです。 解決方法:この問題は、スタック(堆積構造)を使用して効率的に解決できます。スタックに開き括弧をプッシュし、閉じ括弧が出現した際に ...

7月23日 01:11 投稿

二分木のレベル順走査に関するLeetCode問題

NO.116 各ノードの次の右側ポインタを埋める 完全二分木が与えられます。この木はすべての葉ノードが同じレベルにあり、各親ノードが2つの子ノードを持つ特徴があります。二分木は以下のように定義されます: struct Node { int val; Node *left; Node *right; Node *next; } 各ノードのnextポインタを、その次の右側のノードを指すように設定してください。次の ...

7月22日 20:28 投稿

配列の最後の要素の最小値:ビット演算と双ポインタによる解法

問題文 2つの整数 n と x が与えられます。長さ n の正の整数配列 nums を構築する必要があります。すべての 0 > ix) & 1 nのinビットを取り出す:(n >> in) & 1 inビットをnのinビットに設定する:x |= (((n >> in) & 1) > ix) & 1) { ix++; } // nのinビットをxのixビット位置に設定 if ((n >> in) & 1) { ...

7月22日 18:45 投稿

LeetCode 315: 右側にあるより小さい要素の数を計算する

整数配列 nums が与えられた場合、指定された要件に従って新しい配列 counts を返してください。配列 counts は以下の性質を持つ必要があります:counts[i] の値は nums[i] の右側にある nums[i] より小さい要素の数です。 例 1: <strong>入力:</strong>nums = [5,2,6,1] <strong>出力:</strong>[2,1,1,0] <strong>説明:</strong&gt ...

7月21日 03:10 投稿

LeetCode-Java:範囲和検索(一次元および二次元)- 前缀和アルゴリズム

問題 範囲和検索(一次元配列) 整数配列 nums が与えられた場合、以下の種類の複数のクエリを処理する必要があります: インデックス left と right (left と right を含む)の間にある nums の要素の 和 を計算します。ここで left <= right NumArray クラスを実装します: NumArray(int[] nums) 配列 nums を使用してオブジェクトを初期化します int sumRange( ...

7月19日 18:06 投稿

ソートされた配列における二分探索の実装方法

線形探索によるアプローチ 最初に、最も単純な解法である線形探索(総当たり)について検討します。この手法では、配列の先頭から順に各要素を確認し、目的の値と一致するインデックスを返します。 def linear_search(data_array, search_val): for i in range(len(data_array)): if data_array[i] == search_val: return i return -1 このア ...

7月17日 23:05 投稿

アルゴリズム問題:文字列操作とスタックの応用

LeetCode1047: 文字列内の隣接する重複項の削除 問題: 小文字からなる文字列 S が与えられます。重複項削除操作は、隣接する同じ文字のペアを選択して削除します。 S に対して重複項削除操作を繰り返し実行し、削除ができなくなるまで続けます。 すべての重複項削除操作が完了した後、最終的な文字列を返してください。答えは一意であることが保証されます。 例: 例: &l ...

7月16日 23:23 投稿