C++で「自分より大きい要素が2つ以上ある」配列内のすべての要素を検索する方法
問題の概要
n個の数値で構成される配列が与えられたとき、「自分自身より大きい要素が少なくとも2つ存在する」すべての要素を見つけることを考えます。
例えば、配列が A = [2, 8, 7, 1, 5] の場合、結果は [2, 1, 5] となります。これらの要素には、それぞれ2つ以上のより大きな要素が配列内に存在するためです。
解決のアプローチ
この問題は、配列を2回走査するだけで効率的に解くことができます。
- 1回目の走査で、配列の最大値(first_max)と2番目に大きい値(second_max)を求めます。
- 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」が出力されます。
-
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! =
-
【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[