C++のunique関数による重複削除処理
C++のSTLに含まれるunique関数は、隣接する重複要素を除去するための便利な機能です。この関数は<algorithm>ヘッダファイルに定義されており、配列やコンテナ内の連続した重複データを効率的に処理できます。
unique関数の動作原理
unique関数はソート済みのデータに対して最も効果を発揮します。この関数は重複要素を物理的に削除するのではなく、重複する要素を ...
5月18日 18:21 投稿
競技プログラミング問題解説:5つのアルゴリズム問題の実装例
P1628 合并序列 - 文字列のマージ
指定されたプレフィックスで始まるすべての文字列をマルチセットに格納し(重複を許可し、自動的にソートされる)、出力します。
#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
in ...
5月18日 16:12 投稿
等しい要素をマージするアルゴリズムの実装
問題概要
配列内の等しい要素をマージする問題について、2つの異なるアプローチを解説する。
アプローチ1: 優先度付きキューを使用
優先度付きキューを用いて、値とインデックスを管理する方法。以下の手順で処理を行う:
すべての要素を値とインデックスのペアとしてキューに追加
キューの先頭から2要素を取り出し、値が等しければ和を計算して再挿入
等しくなけ ...
5月18日 15:30 投稿
LeetCode解説:216.組合せ総和IIIと17.電話番号の文字列組み合わせ [バックトラッキング編]
LeetCode 216.組合せ総和III
問題リンク:216.組合せ総和III
問題説明
1から9までの数字からk個の数字を選び、その合計がnとなるすべての有効な組み合わせを見つけます。以下の条件を満たす必要があります:
使用できる数字は1から9まで
各数字は最大で1回まで使用可能
結果には重複する組み合わせを含めない
例1:
入力:k = 3, n = 7
出力: [[1,2,4]]
説明: 1 + 2 + ...
5月18日 15:03 投稿
差分配列と累積和のアルゴリズム
差分配列と累積和
テンプレート(疑似コード)
// 元データの読み込み: n, m, a
n, m = 入力()
for i = 0 to n-1:
a[i] = 入力() // 元の配列
// 差分配列の構築
for i = 0 to n-1:
diff[i] = a[i] - a[i-1]
// 区間操作
while m > 0:
m = m - 1
l, r, value = 入力()
diff[l] = diff[l] + value
diff[r+1] = diff[r+1] - value
// 累積和で ...
5月18日 12:33 投稿
二分探索木(BST)
① なぜ二分探索木が必要なのか?
ソートされた配列で要素を検索する場合、二分探索を使用すると、複雑度は O(log n) になります。
しかし、その中に要素を挿入または削除する場合、複雑度は O(n) になります。
この問題に対する解決策として、二分探索木が存在します。
② 二分探索木とは何か?
まず、二分探索木の目的を明確にします:検索、挿入、削除の操作を O(log n) ...
5月18日 08:53 投稿
Go言語による配列操作アルゴリズムの実装:二分探索と双指针法の応用
二分探索の境界条件設計
二分探索は、ソート済みのデータ構造から特定の要素を対数時間で検索するための基盤技術である。実装上の最も重要な要素は、探索区間の定義とループ継続条件の整合性を取り持つことにある。区間の表現方法により、実装パターンは大きく二つに分類される。
一つ目は両端を含む閉区間 `[lo, hi]` を採用する手法である。この場合、左端ポインタが右端 ...
5月18日 02:58 投稿
Codeforces Round #627 解法解説
A - Yet Another Tetris Problem
n個の整数a_iが与えられます。各操作では、任意のiについてa_iを2増やすか、すべてのa_iを1減らすことができます。すべての値を0にできるか判定してください。
解法:すべての値の偶奇が一致する場合のみ可能です。
#include <iostream>
using namespace std;
void solve() {
int n, first, val;
cin >> n >> first;
fi ...
5月17日 19:21 投稿
最大公約数と最小公倍数のアルゴリズム
最大公約数 (GCD)
2つの整数 a と b の最大公約数(GCD)とは、両方を割り切ることができる最大の整数を指します。記号では gcd(a, b) と表されます。
例えば、gcd(15, 18) と gcd(-15, -18) はどちらも 3 になります。
ユークリッドの互除法
最大公約数を求める代表的な方法として、ユークリッドの互除法が知られています。
このアルゴリズムの仕組み:
大きい数を小 ...
5月17日 14:51 投稿
PAT甲级 1045快速排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin>>N;
int a[N],b[N]={0};
for(int i=0;i<N;i++){
cin>>a[i];
}
int isprime=1,count=0;
for(int i=0;i<N;i++){
int isprime=1;
for(int j=0;j<i;j++){
if(a[j]>a[i]){
isprime=0;
...
5月16日 16:23 投稿