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

C++で配列のピーク要素を見つける方法


このチュートリアルでは、与えられた配列の中からピーク要素を見つけるプログラムをC++で作成します。

ピーク要素とは、その両隣にある要素よりも大きい(または等しい)値を持つ要素のことです。それでは、問題を解くための手順を順番に見ていきましょう。

解決手順

  • ダミーデータで配列を初期化します。

  • 最初の要素と最後の要素がピーク要素の条件を満たしているかどうかをチェックします。配列の端は隣接要素が1つしかないため、特別な扱いが必要です。

  • 2番目の要素から配列を走査します。

    • 現在の要素が、直前の要素と直後の要素の両方以上であるかを確認します。

    • 上記の条件を満たした場合、その要素をピーク要素として返します。

  • 結果を出力します。

サンプルコード

実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
int findPeakElement(int arr[], int n) {
    if (n == 1) {
        return arr[0];
    }
    if (arr[0] >= arr[1]) {
        return arr[0];
    }
    if (arr[n - 1] >= arr[n - 2]) {
        return arr[n - 1];
    }
    for (int i = 1; i < n - 1; i++) {
        if (arr[i] >= arr[i - 1] && arr[i] >= arr[i + 1]) {
            return arr[i];
        }
    }
    return arr[0];
}
int main() {
    int arr[] = { 1, 2, 5, 4, 7 };
    cout << findPeakElement(arr, 5) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、以下の出力が得られます。

7

補足:計算量について

このアルゴリズムは配列を線形に走査するため、時間計算量は O(n) となります。また、追加のメモリを使用しないため、空間計算量は O(1) です。なお、配列がソート済みである場合など特定の条件下では、二分探索を用いることで O(log n) まで計算量を削減できる点にも注目しておきましょう。

まとめ

今回はC++を使って、配列からピーク要素を見つける方法を解説しました。境界要素の扱い方や隣接要素との比較ロジックは、配列操作の基本的なパターンなので、ぜひマスターしておいてください。

このチュートリアルについてご不明な点がある場合は、コメント欄でお気軽にお知らせください。

  1. C++で三角形の周囲の長さ(外周)を求める方法

    この記事では、三角形の周囲の長さ(外周)とは何か、三角形の種類ごとの周囲の長さの公式、そしてC++でそれらを求めるプログラムの書き方について詳しく解説します。周囲の長さ(Perimeter)とは周囲の長さとは、図形の外側を1周したときの総距離のことです。基本的には、図形を構成するすべての辺の長さを足し合わせたものになります。三角形の周囲の長さ三角形は3つの辺を持つ図形であるため、その周囲の長さは3辺の長さの合計として求められます。公式:周囲の長さ = すべての辺の合計周囲の長さ = x + y + z三角形の周囲の長さを求めるC++プログラムサンプルコード#include <iostre

  2. Pythonで配列のピーク要素を見つける方法|二分探索による効率的な実装

    配列の中からピーク要素(peak element)を探す問題について解説します。ピーク要素とは、両隣の要素よりも大きい要素のことです。入力配列 nums では nums[i] ≠ nums[i+1] が常に成り立つものとし、ピーク要素を1つ見つけてそのインデックスを返します。配列に複数のピーク要素が含まれる場合は、そのうちどれか1つのインデックスを返せば構いません。さらに、配列の範囲外は nums[-1] = nums[n] = −∞ とみなせるため、端の要素もピークになり得ます。 例えば、配列が [1, 2, 1, 3, 5, 6, 4] の場合、ピーク要素はインデックス 1(値 2)と