C++でソート後の配列における隣接要素の最大差を求める方法
問題の概要
整数型の配列が与えられます。この配列は必ずしもソートされているとは限りません。求めたいのは、ソート後の配列において隣接する要素同士の差の最大値です。
解決の手順はシンプルです。まず配列を昇順(または降順)にソートし、その後、配列を先頭から走査しながら隣接要素間の差 Arr[i+1] - Arr[i] を計算します。各ステップで、その差がこれまでに見つかった最大値より大きければ、最大値を更新していきます。
入出力例
例1
入力: Arr[] = [1, 5, 10, 2, 7]
出力: ソート後の配列における隣接要素の最大差は 3
解説: 昇順にソートすると Arr[] = [1, 2, 5, 7, 10] となります。隣接要素間の差は以下の通りです。
Arr[1]-Arr[0]=1, 最大差=1 Arr[2]-Arr[1]=3, 最大差=3 Arr[3]-Arr[2]=2, 最大差=3 Arr[4]-Arr[3]=3, 最大差=3
例2
入力: Arr[] = [5, 11, 21, 15, 20]
出力: ソート後の配列における隣接要素の最大差は 6
解説: 昇順にソートすると Arr[] = [5, 11, 15, 20, 21] となります。隣接要素間の差は以下の通りです。
Arr[1]-Arr[0]=6, 最大差=6 Arr[2]-Arr[1]=4, 最大差=6 Arr[3]-Arr[2]=5, 最大差=6 Arr[4]-Arr[3]=1, 最大差=6
アルゴリズムの流れ
整数型の配列 Arr[] を入力として受け取ります。
配列を昇順にソートします(降順でも結果は変わりません)。
これまでに見つかった最大差を格納する変数 MaxD を宣言し、初期値として
Arr[1] - Arr[0]を設定します。配列の2番目の要素から最後から2番目の要素までループ処理を行います。
計算した差
Arr[i+1] - Arr[i]が MaxD より大きい場合、MaxD を更新します。最後から2番目の要素に達するまでこの処理を繰り返します。
結果として得られた MaxD を最大隣接差として出力します。
C++による実装例
#include <bits/stdc++.h>
using namespace std;
int max_adj_Diff(int A[], int size){
int MaxD = A[1] - A[0];
for(int i = 1; i < size - 1; i++){
if(A[i+1] - A[i] > MaxD)
MaxD = A[i+1] - A[i];
}
return MaxD;
}
int main(){
int Arr[] = {1, 5, 2, 18, 20, 13};
int n = sizeof(Arr) / sizeof(Arr[0]);
sort(Arr, Arr + n); // 配列を昇順にソート
int md = max_adj_Diff(Arr, n);
cout << "ソート後の配列における隣接要素の最大差 : " << md;
return 0;
}実行結果
上記のコードを実行すると、以下の出力が得られます。
ソート後の配列における隣接要素の最大差: 8
計算量について
このアルゴリズムの時間計算量は、ソート処理が支配的となるため O(n log n) です。ソート後の走査は配列を一度通過するだけなので O(n) で済みます。また、追加のメモリは最大差を保持する変数のみであるため、空間計算量は O(1) となります。
-
C++でソート済み・回転配列から最大要素を効率的に求める方法
問題の概要 昇順にソートされた重複のない要素を持つ配列が、ある未知の位置で回転されているとします。この記事では、二分探索の考え方を活用し、O(log n) の計算量で配列内の最大要素を効率的に見つける C++ プログラムを紹介します。 例 たとえば、入力配列が {30, 40, 50, 10, 20} の場合、最大要素は 50 になります。 アルゴリズム 回転されたソート済み配列には、次のような重要な性質があります。最大要素は「隣接する次の要素が自分より小さい」という条件を満たす唯一の要素です。もし次の要素が自分より小さい要素が存在しなければ、配列は回転されていないことになり、最後の要素が最大
-
C++でソート済み配列を実装するプログラム:選択ソートの基本と実装例
ソート済み配列とは、数値順やアルファベット順など、何らかの基準に従ってすべての要素が整列された配列のことです。配列をソートするためのアルゴリズムには、バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなど、さまざまな種類があります。本記事では、その中でも「選択ソート」を使って配列をソートする方法について、サンプルコードを交えながら詳しく解説します。選択ソートとは選択ソートは、未ソート部分の中から最小の要素を繰り返し見つけ出し、それを未ソート部分の先頭にある要素と入れ替えることで、徐々にソート済み配列を作り上げていく手法です。実装がシンプルで理解しやすいことが特徴で