C++で配列内の前後の要素よりも大きい要素を見つける方法
問題概要
この問題では、n個の正の整数からなる配列 arr[] が与えられます。求めるのは、配列の中で「直前の要素と直後の要素のどちらよりも大きい」要素を見つけることです。
条件の説明
具体的には、ある要素 arr[i] が次の2つの条件を同時に満たすかどうかを判定します。
- arr[i] > arr[i-1](1つ前の要素より大きい)
- arr[i] > arr[i+1](1つ後の要素より大きい)
この両方を満たす要素をすべて出力すればよいわけです。
入出力例で問題を理解する
入力: arr[] = {3, 2, 5, 7, 3, 4, 5}
出力: 7
説明:
要素 7 に注目すると、1つ前の要素は 5、1つ後の要素は 3 です。現在の要素 7 はこの両方よりも大きいため、条件を満たしていることがわかります。
解法アプローチ
最もシンプルな解法は、配列の各要素に対して条件を順番にチェックし、条件を満たす要素を出力するというものです。
手順は以下の通りです。
ステップ1: インデックス 1 から n-2 までループで配列を走査します。
ステップ1.1: 各要素 arr[i] について、arr[i] > arr[i-1] かつ arr[i] > arr[i+1] が成り立つかを判定します。
ステップ1.2: 条件が真であれば、arr[i] を出力します。
なお、配列の先頭と末尾の要素には「前後両方の要素」が存在しないため、チェック対象から除外される点に注意してください。
解法の実装例(C++)
以下は、このアルゴリズムを実装したC++のサンプルプログラムです。
サンプルコード
#include <iostream>
using namespace std;
void findElementsInArray(int arr[], int n) {
for (int i = 1; i < n-1; i++)
if ( (arr[i] > arr[i+1] && arr[i] > arr[i-1]) ) {
cout<<arr[i]<<"\t";
}
}
int main()
{
int n = 8;
int arr[n] = { 5, 4, 7, 1, 17, 8, 3 };
cout<<"The elements that satisfy the given condition are ";
findElementsInArray(arr, n);
return 0;
}実行結果
The elements that satisfy the given condition are 7 17
このプログラムでは、配列 { 5, 4, 7, 1, 17, 8, 3 } の中で、7 は前後の要素(4 と 1)より大きく、17 も前後の要素(1 と 8)より大きいため、両方が出力されます。
計算量について
この解法は配列を一度だけ走査するため、時間計算量は O(n) です。また、追加のメモリを必要としないため、空間計算量は O(1) となります。要素数が多い配列でも効率的に処理できる、シンプルかつ実用的なアルゴリズムです。
-
すべての要素がK以上になるまで配列の要素を追加するC++プログラム|最小ヒープによる効率的な解法
ソートされていない整数の配列 arr[] と整数 K が与えられたとき、配列内の2つの要素を選んで足し合わせて1つの要素にする操作を繰り返し、すべての要素を K 以上にするまでに必要な最小の操作回数を求めるのが本記事のテーマです。問題の例Input: arr[] = {1 10 12 9 2 3}, K = 6 Output: 2解説まず (1 + 2) を加算すると、新しい配列は 3 10 12 9 3 になります。次に (3 + 3) を加算すると、新しい配列は 6 10 12 9 となります。この時点で、リスト内のすべての要素が 6 以上になっていることが確認できます。したがって、答えは
-
C++で配列の全要素がK以上になるまで最小要素を加算する方法
配列(Array)とは、同じデータ型の要素を格納するコンテナであり、各要素は0から始まるインデックスで管理されます。この記事では、整数型の配列を扱い、配列内のすべての要素が指定された数値以上であるかどうかを確認します。具体的には、配列のすべての要素が与えられた数値 K 以上になっているかを判定し、条件を満たしていない場合は、配列内で最も小さい2つの要素を取り出して合計し、その合計値を1つの新しい要素として扱います。その後、再び同じ条件で新しい配列をチェックします。条件が満たされれば、加算を実行した回数を結果として返します。問題例Array = { 2, 6, 3, 12, 7 } K = 5