二分木操作の効率的な実装手法

二分木の剪枝処理 値が0で子ノードを持たないノードを削除する再帰アルゴリズムです。 public TreeNode trimZeroNodes(TreeNode node) { if (node == null) return null; node.left = trimZeroNodes(node.left); node.right = trimZeroNodes(node.right); if (node.value == 0 && node.left == null && node.right == null) { return null; } ...

10月1日 05:47 投稿

全列挙問題におけるDFSとNext Permutationアルゴリズムの比較と実装

全列挙問題における効率的な解法 DFS(深さ優先探索)の実装 再帰を用いたバックトラッキングアプローチで、以下の特徴を持つ: import java.util.*; public class PermutacaoDFS { public List<List<Integer>> gerarPermutacoes(int[] dados) { List<List<Integer>> resultado = new ArrayList(); boolean[] visitado = ...

9月30日 07:57 投稿

NOIP2016 高級問題:怒りの鳥

この問題は、3点を含む放物線の特性を利用して解くことができます。各放物線は原点を通るため、任意の2点で形状を決定できます。 状態遷移にはビットマスクを用い、stateという変数で現在の破壊状況を管理します。右端からi番目のビットが立っていると、対応する対象が破壊済みであることを示します。最終的に全ビットが立った状態(1 << n) - 1に到達すれば解決です ...

9月24日 13:19 投稿

探索と最適化アルゴリズムによる競技プログラミング問題の解法

マトリックス操作と深さ優先探索(DFS) 最初の問題は、与えられたバイナリ行列を行の反転と列の置換によって目標の行列に一致させられるかを判定するものです。行の反転は同一の行に対して2回行うと無効になるため、各行に対する操作は「行う」か「行わないか」の二択です。 まず、各行の要素の合計値を見て、反転することが確定している行を処理します。特定の行において ...

8月15日 00:33 投稿

7日間でツリー構造アルゴリズムをマスターする:基礎からLeetCode実践まで

ツリー構造のアルゴリズムは、程序员面试和算法学习中的核心内容,掌握树的遍历、深度计算、路径查找等技能对解决复杂问题至关重要。本文将通过7天系统学习计划,帮助你从基础到进阶,全面掌握树结构算法,并结合LeetCode实战案例巩固提升。ツリー構造アルゴリズムを学ぶ意義ツリー構造は、データベースインデックス、ファイルシステム、人工知能などの分野广泛应用されて ...

7月24日 01:33 投稿

アカウントのメールアドレスを統合するUnion-Findアプローチ

問題概要 複数のアカウント情報が「名前, メール1, メール2, …」という形式で与えられる。同一人物のアカウントは少なくとも1つのメールアドレスが共通しているため、それらを1つにまとめて返却せよ。 Union-Findを用いた解法 「共通のメールアドレスを持つアカウントは同一人物」という条件は、「同一要素を含む集合をすべて結合」というUnion-Findの典型的な利用シーン ...

7月16日 21:36 投稿

木の直径を求める2つの主要アプローチ

木の直径(Tree Diameter)とは、木構造グラフにおいて最も離れた2つのノード間の距離を指します。この計算には、主に深さ優先探索(DFS)を2回行う方法と、動的計画法(DP)を用いる方法の2つが広く知られています。本記事では、それぞれのアルゴリズムの原理と実装手法について解説します。 DFSによる2回の探索アプローチ この手法は非常に直感的で、計算量も効率的です ...

7月14日 23:27 投稿

AtCoder Beginner Contest 333 スolved 解説

概要 AtCoder Beginner Contest 333 の Implement 問題を解説します。難易度は A-D が初心者〜中級者向け、E はGreedy + スタック操作の基礎知识点が必要です。 A - Three Threes 入力された整数 \(n\) を \(n\) 回連続して出力する問題です。 制約が \(1 \le n \le 9\) と非常に小さいため、ループで単に出力すればOKです。 #include <iostream> using namespac ...

6月29日 20:56 投稿

AtCoder Beginner Contest 378

A - ペアリング 問題文 4つの数が与えられる。各ステップで同じ値の2つの数字を選んで削除する。この操作を最大何回行えるかを求める。 解法 シミュレーションを行う。 コード コードを表示#include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> pii; const int mxn = 1e6 + 5; void solve() { int a, b, c, d; ...

6月27日 01:13 投稿

再帰関数の設計手法

1. はじめに 再帰は、関数型言語のみならず、あらゆるプログラミングパラダイムにおいて極めて重要な概念である。本稿では、数学的帰納法との関連性を踏まえながら、再帰関数の設計手法について体系的解説していく。 2. 再帰と数学的帰納法 2.1 数学的帰納法の原理 数学的帰納法は、自然数に関する命題を証明するための手法である。その原理は以下の2つのステップから ...

6月22日 22:05 投稿