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

C++で「自分より大きい要素が2つ以上ある」配列内のすべての要素を検索する方法

問題の概要

n個の数値で構成される配列が与えられたとき、「自分自身より大きい要素が少なくとも2つ存在する」すべての要素を見つけることを考えます。

例えば、配列が A = [2, 8, 7, 1, 5] の場合、結果は [2, 1, 5] となります。これらの要素には、それぞれ2つ以上のより大きな要素が配列内に存在するためです。

解決のアプローチ

この問題は、配列を2回走査するだけで効率的に解くことができます。

  1. 1回目の走査で、配列の最大値(first_max)と2番目に大きい値(second_max)を求めます。
  2. 2回目の走査で、second_maxより小さいすべての要素を出力します。

この方法の時間計算量は O(n)、追加で必要なメモリは O(1) と非常に効率的です。

サンプルコード(C++)

#include<iostream>
using namespace std;
void searchElements(int arr[], int n) {
   int first_max = INT_MIN, second_max = INT_MIN;
   for (int i = 0; i < n; i++) {
      if (arr[i] > first_max) {
         second_max = first_max;
         first_max = arr[i];
      } else if (arr[i] > second_max)
         second_max = arr[i];
   }
   for (int i = 0; i < n; i++)
   if (arr[i] < second_max)
   cout << arr[i] << " ";
}
int main() {
   int arr[] = { 2, 9, 1, 7, 5, 3, 17};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Elements are: ";
   searchElements(arr, n);
}

実行結果

Elements are: 2 1 7 5 3

コードの解説

searchElements関数では、まず1回目のループで最大値と2番目に大きい値を追跡します。現在の要素がfirst_maxより大きい場合は、first_maxの値をsecond_maxに退避させてからfirst_maxを更新します。そうでなくsecond_maxより大きい場合は、second_maxだけを更新します。

続く2回目のループでは、second_maxより厳密に小さい要素のみを出力します。上記の例では、最大値が17、2番目に大きい値が9であるため、9より小さい「2 1 7 5 3」が出力されます。

  1. C++で配列要素の階乗の最大公約数(GCD)を求める方法

    N個の要素を持つ配列Aが与えられたとき、配列内のすべての要素の階乗の最大公約数(GCD)を求めることを考えます。例えば、配列の要素が {3, 4, 8, 6} の場合、各要素の階乗は 3! = 6、4! = 24、8! = 40320、6! = 720 となり、これらのGCDは 6 になります。解法のポイントここで重要な数学的な性質があります。2つの数のGCDとは、両方の数を割り切る最大の数のことです。階乗の場合、小さい数の階乗は必ず大きい数の階乗を割り切ることができます。つまり、2つの階乗のGCDは、小さい方の数の階乗そのものになります。例えば、3! と 5! のGCDを考えると、3! =

  2. 【C++】配列内の隣接する要素同士の絶対差を求める方法

    この記事では、配列内の隣接する2つの要素のペアごとに絶対差(絶対値の差)を求める方法を解説します。配列に n 個の要素が含まれている場合、結果として得られる配列には n-1 個の要素が格納されます。例えば、配列の要素が {8, 5, 4, 3} である場合、計算結果は次のようになります。|8−5| = 3、|5−4| = 1、|4−3| = 1アルゴリズムpairDiff(arr, n)begin    res := 結果を格納するための配列    for i in range 0 to n-2, do       res[