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

C++で配列のパーティションポイント(分割点)を見つける方法

このチュートリアルでは、C++を使って配列の「パーティションポイント(分割点)」を見つける方法を解説します。パーティションポイントとは、その要素より左側にあるすべての要素が小さく、右側にあるすべての要素が大きいという条件を満たす位置のことです。

解決の手順

問題を解くための流れは以下の通りです。

  • 配列を初期化します。
  • 配列を走査します。
    • インデックス 0 から i までの各要素が、現在の値より小さいかどうかを確認します。
    • インデックス i+1 から n-1 までの各要素が、現在の値より大きいかどうかを確認します。
    • 両方の条件が満たされた場合、その値を返します。
  • 見つかったパーティションポイントを出力します。

サンプルコード

それでは、実際のコードを見てみましょう。

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

int findPartitionElement(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        bool is_found = true;
        // 左側の要素がすべて小さいかチェック
        for (int j = 0; j < i; j++) {
            if (arr[j] >= arr[i]) {
                is_found = false;
                break;
            }
        }
        // 右側の要素がすべて大きいかチェック
        for (int j = i + 1; j < n; j++) {
            if (arr[j] <= arr[i]) {
                is_found = false;
                break;
            }
        }
        if (is_found) {
            return arr[i];
        }
    }
    return -1;
}

int main() {
    int arr[] = { 4, 3, 5, 6, 7 };
    cout << findPartitionElement(arr, 5) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

5

処理の解説

この例では、配列 { 4, 3, 5, 6, 7 } の中から条件を満たす要素を探しています。要素「5」に注目すると、左側には 4 と 3(どちらも 5 より小さい)、右側には 6 と 7(どちらも 5 より大きい)があるため、「5」がパーティションポイントとして返されます。

なお、このアルゴリズムの計算量は O(n²) です。配列のサイズが大きい場合は、事前に最大値・最小値を管理しながら一度の走査で判定する O(n) の手法を検討するとよいでしょう。

まとめ

本記事では、C++で配列のパーティションポイントを見つけるシンプルな方法を紹介しました。二重ループによる素直な実装は理解しやすく、アルゴリズムの基礎学習にも最適です。チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

  1. C++で配列内の不動点(インデックスと等しい値)を二分探索で効率的に検索する方法

    本記事では、ソート済みの配列から「不動点(Fixed Point)」と呼ばれる特殊な要素を検索する方法を解説します。不動点とは、要素の値がそのインデックス(添字)と一致している要素のことです。プログラムは不動点が存在すればその値を返し、存在しない場合は -1 を返します。なお、配列には負の数が含まれることもあり、データ要素はソート済みであると仮定します。二分探索による効率的なアプローチすべての要素を順に確認する線形探索では O(n) の計算量が必要ですが、配列がソート済みであるという性質を利用すると、二分探索(バイナリサーチ)によって O(log n) という高速な計算量でこの問題を解くことが

  2. C++で点が円の内側にあるかどうかを判定する方法

    円の中心座標と半径、そして1つの点が与えられたとき、その点が円の内側にあるかどうかを判定する問題です。この問題は、点から円の中心までの距離を計算すれば解決できます。その距離が半径以下であれば点は円の内側(または円周上)にあり、そうでなければ外側にあると判断できます。 判定の考え方 点 (x, y) と円の中心 (cx, cy) の間の距離 d は、次の式で求められます。 d = √((x − cx)² + (y − cy)²) この距離 d が半径 r 以下であれば点は円の内側、r より大きければ外側です。実際のプログラムでは、平方根の計算を省いて「距離の2乗」と「半径の2乗」を直接比較すると