C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列の全要素を等しくするための最小操作回数を求めるアルゴリズム

問題の概要

n個の正の整数からなる配列が与えられたとき、すべての要素を等しい値にするために必要な最小の操作回数を求めます。操作としては、配列の任意の要素に対して「加算・減算・乗算・除算」のいずれかを1回適用することができます。

入力配列が {1, 2, 3, 4} の場合、最小で 3回 の操作で全要素を等しくできます。たとえば、値が1の要素に対して3回の加算を行えば、すべての要素を4に揃えることができます。

解法の考え方

この問題のポイントは、「すでに同じ値になっている要素は操作する必要がない」という点に気づくことです。したがって、配列内で最も多く出現する値(最頻値)に他の要素をすべて揃えれば、操作回数を最小にできます。

アルゴリズムの手順

  1. ハッシュマップを使って、各要素の出現回数を集計します。
  2. 最大の出現回数(maxFrequency)を求めます。
  3. 答えは「配列の長さ n − maxFrequency」となります。

C++での実装例

#include <bits/stdc++.h>
using namespace std;

int getMinOperations(int *arr, int n) {
    unordered_map<int, int> hash;
    for (int i = 0; i < n; ++i) {
        hash[arr[i]]++;
    }
    int maxFrequency = 0;
    for (auto elem : hash) {
        if (elem.second > maxFrequency) {
            maxFrequency = elem.second;
        }
    }
    return (n - maxFrequency);
}

int main() {
    int arr[] = {1, 2, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Minimum required operations = " <<
        getMinOperations(arr, n) << endl;
    return 0;
}

上記のプログラムをコンパイルして実行すると、次の出力が得られます。

出力

Minimum required operations = 3

計算量

  • 時間計算量: O(n) — 配列を1回走査して各要素の頻度を集計し、その後ハッシュマップを走査して最大頻度を求めます。
  • 空間計算量: O(n) — 最悪の場合(すべての要素が異なる値のとき)、ハッシュマップにn個のエントリが格納されます。

まとめ

この問題は「最頻値以外の要素だけを操作すればよい」というシンプルな発想で解けます。ハッシュマップによる頻度集計を活用することで、線形時間 O(n) で効率よく最小操作回数を求めることができます。

  1. C++で配列の全要素を同じ値にするための最小削除操作数を求めるアルゴリズム

    問題概要n個の要素からなる配列が与えられます。要素には重複が含まれる場合があります。この配列から任意の数の要素を削除できるとき、すべての要素を同じ値にするために必要な最小の削除数を求めるのが課題です。例として、次の配列を考えてみましょう。arr[] = {10, 8, 10, 7, 10, -1, -4, 12}この場合、最も多く出現している「10」以外の5つの要素を削除すれば、配列の全要素を10で統一できます。つまり、答えは5回の削除となります。解法の考え方この問題の鍵となるのは、「削除する量を最小化する = 残す要素の数を最大化する」という発想です。全要素を同じ値にするためには、必ずどれか

  2. 【C++】配列内の隣接する要素同士の絶対差を求める方法

    この記事では、配列内の隣接する2つの要素のペアごとに絶対差(絶対値の差)を求める方法を解説します。配列に n 個の要素が含まれている場合、結果として得られる配列には n-1 個の要素が格納されます。例えば、配列の要素が {8, 5, 4, 3} である場合、計算結果は次のようになります。|8−5| = 3、|5−4| = 1、|4−3| = 1アルゴリズムpairDiff(arr, n)begin    res := 結果を格納するための配列    for i in range 0 to n-2, do       res[