C++で配列をバランスさせるために追加する最小の値を見つける方法
配列のバランスを取る値とは
n個の要素(nは偶数)を持つ配列Aがあるとします。この配列をバランスさせるために必要な値を見つけるのが課題です。配列のサイズが偶数であるため、配列を前半と後半の2つに分割できます。バランスが取れている状態とは、前半の要素の合計と後半の要素の合計が一致することを指します。
例えば、配列が A = [1, 2, 3, 2, 5, 3] の場合を考えてみましょう。前半 [1, 2, 3] の合計は6、後半 [2, 5, 3] の合計は10です。この2つの合計の差は4なので、配列をバランスさせるためには4という値が必要になります。
アルゴリズムの考え方
この問題の解法は非常にシンプルです。以下の手順で求めることができます。
1. 配列の前半(インデックス0から n/2 - 1 まで)の要素の合計を計算する
2. 配列の後半(インデックス n/2 から n - 1 まで)の要素の合計を計算する
3. 両者の合計の絶対差を計算して返す
この絶対差こそが、配列をバランスさせるために追加すべき最小の値となります。
C++による実装例
#include<iostream>
#include<cmath>
using namespace std;
int getValueToBalance(int a[], int n) {
int left_sum = 0;
for (int i = 0; i < n/2; i++)
left_sum += a[i];
int right_sum = 0;
for (int i = n/2; i < n; i++)
right_sum += a[i];
return abs(left_sum - right_sum);
}
int main() {
int arr[] = {1, 2, 3, 2, 5, 3};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "The number for balancing: " << getValueToBalance(arr, n);
}実行結果
The number for balancing: 4
コードの解説
関数 getValueToBalance では、まず前半の要素を順番に加算して left_sum を求め、続いて後半の要素を加算して right_sum を求めています。最後に abs() 関数を使って2つの合計の差の絶対値を返すことで、どちらの半分が大きい場合でも正しくバランス値を取得できます。
このアルゴリズムの計算量は、配列を一度だけ走査するため O(n) となり、非常に効率的です。補助的な記憶領域も定数 O(1) で済むため、メモリの面でも優れた解法といえます。
-
C++で配列内の数値の頻度(出現回数)を求める方法
配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で
-
C++で配列の合計を偶数にするために追加する最小の数を求める方法
ある数値が格納された配列があるとします。この配列の要素の合計を偶数にするために、最小でいくつの数を追加する必要があるかを求めるのが本記事の目的です。ただし、追加する数は0より大きい正の整数でなければなりません。ルールはシンプルです。要素の合計が奇数の場合は1を追加すれば偶数になります。一方、合計がすでに偶数である場合は、0を追加することが許されていないため、最小の正の偶数である2を追加することになります。アルゴリズムaddMinNumber(arr)begin s := 0 for each element e from arr, do s := e + s