リンクリストの基本操作:要素削除・設計・反転を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 投稿

最長共通部分列の解法

最長共通部分列 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 投稿