C++で配列内の最小値の出現回数(頻度)を求める方法
この記事では、配列の中で最小の要素が何回出現するか(頻度)を求める方法を解説します。
例として、配列の要素が [5, 3, 6, 9, 3, 7, 5, 8, 3, 12, 3, 10] である場合を考えてみましょう。この配列の最小値は 3 であり、その出現回数は 4 回です。したがって、出力は 4 となります。
解決のアプローチ
この問題を解く手順は非常にシンプルで、以下の2ステップで構成されます。
1. まず、配列全体を走査して最小値を見つける
2. 次に、その最小値と一致する要素の個数を数える
この方法の時間計算量は O(n) であり、配列を2回走査しますが、線形時間で処理が完了するため効率的です。
サンプルコード
#include<iostream>
using namespace std;
// 配列内の最小値を求める関数
int min_element(int arr[], int n) {
int min = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min)
min = arr[i];
}
return min;
}
// 最小値の出現回数を数える関数
int smallestNumFreq(int *arr, int n) {
int minimum = min_element(arr, n);
int count = 0;
for (int i = 0; i < n; i++) {
if (arr[i] == minimum)
count++;
}
return count;
}
int main() {
int arr[] = {5, 3, 6, 9, 3, 7, 5, 8, 3, 12, 3, 10};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Frequency of smallest element: " << smallestNumFreq(arr, n);
}実行結果
Frequency of smallest element: 4
コードの解説
このプログラムは、2つの補助関数と main 関数で構成されています。
min_element 関数: 最初の要素を仮の最小値とし、残りの要素と順に比較することで、配列内の最小値を特定します。
smallestNumFreq 関数: min_element 関数で取得した最小値をもとに、配列を再度走査し、最小値と一致する要素をカウントします。
main 関数: サンプル配列を定義し、sizeof 演算子を使って要素数を計算した上で、smallestNumFreq 関数を呼び出して結果を表示します。
なお、配列を1回の走査で最小値と出現回数を同時に求める実装も可能です。その場合は、より小さい値が見つかった時点でカウントをリセットし、等しい値が見つかった場合にカウントを増やすことで、計算量をさらに最適化できます。
-
C++で配列内の数値の頻度(出現回数)を求める方法
配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で
-
C++で構造体配列から最大値を検索する方法
はじめに本記事では、C++を使って構造体配列の中から最大値を持つ要素を検索する方法を解説します。例として、以下のような「身長(フィートとインチ)」を表す構造体が与えられた場合を考えます。struct Height{ int feet, inch; };この構造体型の配列から、最も身長の高い要素を見つけることが目標です。アルゴリズムの考え方アプローチは非常にシンプルです。以下の手順で処理を進めます。配列を先頭から順に走査する。各要素の身長をインチ単位に換算する。換算式は「12 × フィート + インチ」。現在の最大値と比較し、より大きい値が見つかれば、その値とインデックスを更新する。最終