C++で差がkに等しいすべての異なるペアを数える方法
はじめに
このチュートリアルでは、C++を使って「差がkに等しい異なるペア」を見つけて数える方法を解説します。
具体的には、整数型の配列と値kが与えられ、その中から差がちょうどkとなるすべての異なるペアを数えることが課題です。
アルゴリズムの考え方
最もシンプルなアプローチは、配列の要素を1つずつ順番に選び、それ以降の要素との差をすべてチェックする方法です。2つの要素の差がkに等しければ、カウンターを1つ増やします。
例えば、配列 {1, 5, 3, 4, 2}、k = 3 の場合、差が3となるペアは (1, 4) と (5, 2) の2つなので、答えは2になります。
実装例
#include<iostream>
using namespace std;
int count_diffK(int arr[], int n, int k) {
int count = 0;
// 要素を1つずつ選んで比較する
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++)
if (arr[i] - arr[j] == k || arr[j] - arr[i] == k)
count++;
}
return count;
}
int main() {
int arr[] = {1, 5, 3, 4, 2};
int n = sizeof(arr)/sizeof(arr[0]);
int k = 3;
cout << "Count of pairs with given diff is " << count_diffK(arr, n, k);
return 0;
}出力
Count of pairs with given diff is 2
計算量について
この方法では、すべての要素の組み合わせを比較するため、時間計算量は O(n²) となります。一方、追加のメモリは必要としないため、空間計算量は O(1) です。
配列のサイズが大きい場合は、配列をソートしてから二分探索や双方向ポインタを活用することで、O(n log n) まで計算量を抑える最適化も可能です。
-
C++で指定されたGCD値と一致する部分集合の個数を数える方法
問題の概要 正の整数を含む配列 arr と、GCD(最大公約数)の値を格納した配列 GCD[] が与えられます。この問題の目標は、arr[] の要素から構成されるすべての部分集合のうち、そのGCDが GCD[] に指定された値と一致するものの個数を求めることです。 入力例と出力例 例1 入力: arr[] = {10, 5, 6, 3}, GCD[] = {2, 3, 5} 出力: 指定されたGCD値と一致する部分集合の個数: 1 2 2 説明: GCDが2となる部分集合は [10, 6] です。 GCDが3となる部分集合は [3] と [6, 3] です。 GCDが5となる部分集合は [
-
C++でマンハッタン距離と等しい距離を持つパスの数を求める方法
2次元座標系上の2つの点 (x1, y1) と (x2, y2) を表す変数 x1、x2、y1、y2 が与えられます。この記事の目的は、これら2点間のマンハッタン距離と等しい距離を持つすべてのパスの総数を求めることです。 マンハッタン距離とは 2点 (x1, y1) と (x2, y2) の間のマンハッタン距離は、次の式で定義されます。 MD = |x1 − x2| + |y1 − y2| ここで、A = |x1 − x2|、B = |y1 − y2| とおきます。 マンハッタン距離と等しい距離を持つすべてのパスは、合計 (A + B) 本の移動で構成されます。そのうち A 本が水平方向の移動