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

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) となります。

  1. C++でソート済み・回転配列から最大要素を効率的に求める方法

    問題の概要 昇順にソートされた重複のない要素を持つ配列が、ある未知の位置で回転されているとします。この記事では、二分探索の考え方を活用し、O(log n) の計算量で配列内の最大要素を効率的に見つける C++ プログラムを紹介します。 例 たとえば、入力配列が {30, 40, 50, 10, 20} の場合、最大要素は 50 になります。 アルゴリズム 回転されたソート済み配列には、次のような重要な性質があります。最大要素は「隣接する次の要素が自分より小さい」という条件を満たす唯一の要素です。もし次の要素が自分より小さい要素が存在しなければ、配列は回転されていないことになり、最後の要素が最大

  2. C++でソート済み配列を実装するプログラム:選択ソートの基本と実装例

    ソート済み配列とは、数値順やアルファベット順など、何らかの基準に従ってすべての要素が整列された配列のことです。配列をソートするためのアルゴリズムには、バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなど、さまざまな種類があります。本記事では、その中でも「選択ソート」を使って配列をソートする方法について、サンプルコードを交えながら詳しく解説します。選択ソートとは選択ソートは、未ソート部分の中から最小の要素を繰り返し見つけ出し、それを未ソート部分の先頭にある要素と入れ替えることで、徐々にソート済み配列を作り上げていく手法です。実装がシンプルで理解しやすいことが特徴で