配列内の重複要素を特定するアルゴリズム

以下は、C++における配列サイズの取得に関するコード例である。関数に渡された配列はポインタに変換されるため、sizeof演算子は元の配列サイズではなくポインタのサイズ(通常4または8バイト)を返す点に注意が必要である。 #include <cstdio> size_t get_array_size(int arr[]) { return sizeof(arr); // 実際にはポインタのサイズが返される } int main() ...

7月18日 21:11 投稿

iOS開発におけるクイックソートのObjective-C実装

クイックソート(Quick Sort)はバブルソートの改良版です。 クイックソートはC. A. R. ホーアによって1962年に提案されました。基本的な考え方は以下の通りです:一度の処理でソート対象のデータを二つの独立した部分に分割し、一方のすべての要素がもう一方のすべての要素より小さくなるようにします。その後、この方法をそれぞれの部分に対して再帰的に適用することで ...

7月18日 17:44 投稿

アルゴリズム問題の効率的な解法

本記事では、複数のアルゴリズム問題について考察し、それぞれの問題に対する効率的な解法を説明します。 避難所配置問題 この問題は、特定の範囲内で最も効率的な方法で避難所を配置する必要がある。具体的には、以下の関数を考える: [ g(y, r) ] は、右境界が (r) の場合に、位置 (y) に避難所を設置したときのコストを表す。 我々が必要とするのは、[ \max_{j \geq mid ...

7月18日 01:21 投稿

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

線形探索によるアプローチ 最初に、最も単純な解法である線形探索(総当たり)について検討します。この手法では、配列の先頭から順に各要素を確認し、目的の値と一致するインデックスを返します。 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 投稿

JOI 2013 国内予選最終ラウンド解説

問題1:交互配列の最長連結区間 与えられた 0-1 列において、隣接要素が交互に変化する(例:01010)最大長の連続部分列を求める。ただし、1つの「交互セグメント」を反転することで、より長い連続交互列を得られる可能性がある。 まず、入力列を交互性に基づいて分割し、各セグメントの左右端点を記録。その後、隣接する3つのセグメント(左・中・右)を結合した長さを評 ...

7月14日 01:06 投稿

LeetCodeにおける動的計画法:最長増加部分列と最長重複部分配列の解説

最長増加部分列 (LeetCode 300) 整数配列が与えられた場合、その中に含まれる最長の狭義増加部分列(Strictly Increasing Subsequence)の長さを見つけます。部分列とは、配列から要素をいくつか(0個でもよい)削除し、残りの要素の順序を変更しないで得られる配列のことを指します。 この問題は動的計画法(DP)を用いて解くのが一般的です。2層のループ構造が必要と ...

7月11日 22:38 投稿

フェニック木(Binary Indexed Tree)の基礎と応用

フェニック木(Binary Indexed Tree, BIT)は、主に数列の prefix sum(接頭辞和)を効率的に管理・計算するために設計されたデータ構造です。セグメント木と比較して実装が簡潔であり、定数倍の計算コストが低いため、頻繁な更新とクエリが発生する箇所で広く利用されています。本記事では、基本的な1次元の構造から、差分を利用した区間更新、および2次元への拡張につい ...

7月11日 16:07 投稿

doocs/leetcode リポジトリへのコントリビュート手順:アルゴリズム解法をオープンソースで共有する

doocs/leetcode は、LeetCode や『世界で闘うプログラミング・インタービュー(原題: Cracking the Coding Interview)』などのアルゴリズム問題に対し、多様なプログラミング言語での解法を提供することを目的としたオープンソースプロジェクトです。このプロジェクトへの貢献は、自身のアルゴリズムスキルの向上だけでなく、コードレビューを通じた技術力の研鑽や、世界 ...

7月10日 17:03 投稿

2023年春季西南民族大学プログラミングコンテスト 第6回 解説

問題解説 - L1-1 今日こそ勝利を掴む この問題は単純な出力問題です。指定された文字列と日付を出力するだけです。 #include <iostream> using namespace std; void process() { cout << "I'm gonna win! Today!" << endl; cout << "2022-04-23" << endl; } 問題解説 - L1-2 ダイヤモンドの植栽 整数nとvが与えられ、nをvで割 ...

7月9日 21:52 投稿

動的計画法による部分列問題の徹底攻略:1次元・2次元、連続・非連続の各パターン

1. 不相交の線 (LeetCode 1035) この問題は、一見すると幾何学的な制約があるように見えますが、本質的には「最長共通部分列 (LCS)」を求める問題と同じです。2つの配列間で線を引く際に交差させないという条件は、選ぶ要素の相対的な順序を維持することを意味します。 アルゴリズムの定義 dp[i][j] を、配列 data1 の最初の i 個の要素と、配列 data2 の最初の j 個の要 ...

7月7日 17:15 投稿