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

C++で配列内の全要素のフロア(下限値)を効率的に求める方法

この問題では、整数要素からなる配列 arr[] が与えられます。求めるのは、同じ配列内に存在する各要素のフロア(下限値)です。フロアとなる要素が見つかればその値を出力し、存在しない場合は -1 を出力します。

配列における要素のフロアとは?

配列内のある要素のフロアとは、その要素以下の値を持つ要素の中で、最も近い(最大の)要素のことを指します。

具体例で理解しよう

入力: arr[] = {3, 1, 5, 7, 8, 2}
出力: 2 -1 3 5 7 1

この例では、要素 3 のフロアは 2、要素 1 以下の要素は他に存在しないため -1、要素 5 のフロアは 3、というように各要素ごとに計算しています。

解法アプローチ

アプローチ1: 二重ループを使用する方法

最もシンプルな方法は、二重ループを使うことです。外側のループで配列の各要素を順に処理し、内側のループでその要素のフロアとなる要素を配列内から探します。ただし、この方法の計算量は O(n²) となるため、大きな配列では非効率になります。

アプローチ2: ソート済み配列と二分探索を使用する方法

より効率的なのが、追加の配列に元の配列をソートした状態で保存しておく方法です。その後、元の配列を走査しながら、二分探索(バイナリサーチ)アルゴリズムによってソート済み配列から各要素のフロアを高速に見つけます。この方法の計算量は O(n log n) に抑えられます。

実装例

以下は、本解法の動作を示す C++ プログラムです。

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

void printFloorEle(int arr[], int n){
    vector<int> sortedArr(arr, arr + n);
    sort(sortedArr.begin(), sortedArr.end());
    for (int i = 0; i < n; i++) {
        if (arr[i] == sortedArr[0]) {
            if (arr[i] == sortedArr[1])
                cout<<arr[i];
            else
                cout<<-1;
            cout<<"\t";
            continue;
        }
        auto iterator = lower_bound(sortedArr.begin(),sortedArr.end(), arr[i]);
        if (iterator != sortedArr.end() && *(iterator + 1) == arr[i])
            cout<<arr[i]<<"\t";
        else
            cout<<*(iterator - 1)<<"\t";
    }
}
int main(){
    int arr[] = { 3, 1, 5 ,7, 8, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout<<"The Floor of every element of the given array is ";
    printFloorEle(arr, n);
    return 0;
}

出力結果

The Floor of every element of the given array is 2 -1 3 5 7 1
  1. C++のSTLでstd::arrayを実装するサンプルプログラム

    C++のSTL(標準テンプレートライブラリ)には、固定長の配列を安全かつ便利に扱えるコンテナstd::arrayが用意されています。本記事では、配列に対するさまざまな操作(サイズの取得・要素の挿入・先頭/末尾要素の参照・全要素の表示など)をメニュー形式で選択できるサンプルプログラムを、擬似コード・実際のコード・実行結果とあわせて解説します。 配列に対する操作と擬似コード まず、プログラム全体の流れを擬似コードで確認しましょう。 開始 main()関数内で TRUEの間、以下を繰り返す 選択肢を表示する 選択内容を入力として受け取る sw

  2. C++で配列の最大要素とその位置を見つける方法

    配列の最大要素とは配列には複数の要素が格納されており、その中で他のすべての要素よりも大きい値を持つものが「最大要素」です。具体例51724上記の配列の場合、最大要素は7であり、インデックス2の位置に存在します。それでは、配列の最大要素を求めるC++プログラムを見ていきましょう。サンプルコード#include <iostream> using namespace std; int main() { int a[] = {4, 9, 1, 3, 8}; int largest, i, pos; largest = a[0]; for(i=1; i<