C++で配列内の最大ギャップ(最大値と最小値の差)を求める方法
このチュートリアルでは、与えられた配列の中から2つの要素間の最大の差(最大ギャップ)を求めるプログラムをC++で作成します。アプローチは非常にシンプルで、配列内の最大値と最小値を見つけ、その差を計算するだけです。
解決の手順
- 配列を初期化します。
- 配列内の最大値と最小値を見つけます。
- 「最大値 − 最小値」を計算して返します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int findLargestGap(int arr[], int n) {
int maxVal = arr[0], minVal = arr[0];
for (int i = 0; i < n; i++) {
if (arr[i] > maxVal) {
maxVal = arr[i];
}
if (arr[i] < minVal) {
minVal = arr[i];
}
}
return maxVal - minVal;
}
int main() {
int arr[] = {3, 4, 1, 6, 5, 6, 9, 10};
cout << findLargestGap(arr, 8) << endl;
return 0;
}
実行結果
上記のコードをコンパイルして実行すると、以下の出力が得られます。
9
処理の流れの解説
このプログラムでは、まず配列の最初の要素を最大値・最小値の初期値として設定します。その後、forループで全要素を一度だけ走査し、より大きな値が見つかれば最大値を、より小さな値が見つかれば最小値を更新していきます。最後に maxVal - minVal を返すことで、配列内の要素間の最大差が求まります。
今回の例では、配列 {3, 4, 1, 6, 5, 6, 9, 10} の最大値は 10、最小値は 1 であるため、出力は 10 - 1 = 9 となります。
なお、このアルゴリズムの時間計算量は O(n)、空間計算量は O(1) であり、配列を1回走査するだけで済むため非常に効率的です。また、変数名に標準ライブラリの std::max / std::min と紛らわしい名前を使わないよう、maxVal / minVal としています。
まとめ
配列の最大ギャップを求める問題は、「最大値と最小値を見つけて差を取る」という基本テクニックだけで解決できる好例です。ソートを行う必要がないため、線形時間で処理できます。本チュートリアルについてご不明な点がある場合は、コメント欄でお気軽にお尋ねください。
-
C++で同一直線上に存在する最大点数を求めるアルゴリズム
問題概要 2次元平面上に複数の点が与えられたとき、同じ直線上に存在する点の最大数を求めるのがこの問題の目的です。 例えば、下図のような6つの点が与えられた場合、最も多くの点が乗っている直線上には4つの点が存在します。 解法のアプローチ この問題は、隣り合う2点を通る直線を基準にして、残りのすべての点がその直線上に乗っているかどうかを順番に判定していくことで解けます。 3点 (x1, y1)、(x2, y2)、(x3, y3) が同一直線上にあるかどうかは、「傾きが等しい」こと、すなわち外積(クロス積)が0になることを利用して判定できます。 (y3 − y2) × (x2 − x1) = (
-
【C++入門】配列を関数に渡す3つの方法をわかりやすく解説
C++では、配列全体をそのまま関数の引数として渡すことはできません。しかし、インデックスを付けずに配列名を指定することで、配列へのポインタを渡すことができます。これは「配列名は先頭要素へのポインタに読み替えられる(配列の減衰)」というC++の仕組みによるものです。1次元配列を関数の引数として渡したい場合は、以下の3つのいずれかの方法で関数の仮引数を宣言します。どの方法でも、コンパイラに対して「整数型のポインタを受け取る」という情報が伝わるため、動作結果はすべて同じになります。配列を関数に渡す3つの宣言方法1. ポインタとして仮引数を宣言するvoid myFunction(int *param)