C++で配列がペアワイズソートされているかどうかを確認する方法
要素数 n の配列 A が与えられたとき、その配列が「ペアワイズソート(pairwise sorted)」されているかどうかを判定します。ペアワイズソートとは、隣接する2つの要素からなるペアごとに昇順に並んでいる状態を指します。
例えば、配列が {8, 10, 18, 20, 5, 15} の場合を考えてみましょう。この配列は (8, 10)、(18, 20)、(5, 15) という3つのペアに分けられます。それぞれのペア内で前の要素が後の要素以下になっているため、この配列はペアワイズソートされていると判断できます。
なお、配列の要素数が奇数の場合、最後の1つの要素はペアを形成できないため無視されます。
アルゴリズムの考え方
この問題へのアプローチは非常にシンプルです。インデックス i を 0 から始めて 2 ずつ増やしながらループし、各ステップで arr[i] が arr[i+1] 以下であるかどうかを確認します。もし arr[i] > arr[i+1] となるペアが見つかった時点で false を返し、すべてのペアが条件を満たしていれば true を返します。
計算量は O(n/2)、つまり O(n) となり、非常に効率的です。
実装例
#include <iostream>
#include <cmath>
using namespace std;
bool isPairwiseSorted(int arr[], int n) {
if(n <= 1)
return true;
for(int i = 0; i<n; i += 2){
if(arr[i] > arr[i + 1])
return false;
}
return true;
}
int main() {
int arr[] = {8, 10, 18, 20, 5, 15};
int n = sizeof(arr)/sizeof(arr[0]);
if(isPairwiseSorted(arr, n)){
cout << "This is pairwise sorted";
} else {
cout << "This is not pairwise sorted";
}
}出力結果
This is pairwise sorted
ポイントのまとめ
- 要素数が 0 または 1 の場合は、ペアが存在しないため常に true を返します。
- ループ変数 i は 2 ずつ増加させることで、重なりなく各ペアを一度だけチェックできます。
- 奇数個の配列では最後の要素が自動的に無視されます(i+1 が範囲外になる前にループが終了するため)。
-
C++で木グラフ(ツリーグラフ)が線形かどうかを判定する方法
本記事では、C++を使って与えられた木グラフ(ツリーグラフ)が「線形(リニア)」であるかどうかを判定する方法を解説します。線形の木グラフとは、すべてのノード(頂点)を一本の線上に連ねて表現できるグラフのことです。 線形木グラフとは たとえば、下の図のようなグラフは一本の線で表現できるため、線形の木グラフです。 一方、次のように途中で分岐(複数の子ノード)を持つ木は線形ではありません。 線形グラフを判定する条件 ある木グラフが線形かどうかは、次の2つの条件で確認できます。 ノード数が1の場合、その木グラフは線形である。 n個のノードのうち (n − 2) 個のノードの次数が2である場合、そ
-
配列が高さnのBSTを表せるかどうかをC++で判定する方法
サイズnの配列が与えられたとき、その配列が高さnの二分探索木(BST)を表すことができるかどうかを判定する問題について解説します。ここで「高さn」とは、根から葉までの最長パスがn個のノードで構成されることを意味し、つまり配列の各要素が木の各レベルに1つずつ対応することを指します。 問題の理解 BSTのルールに従って要素を挿入していくとき、配列の順序通りに挿入した結果、高さがちょうどn(要素数と同じ)になるかどうかを確認します。これは、配列の各要素が前の要素の左または右の子として挿入され、一度も同じレベルに複数のノードが配置されないことを意味します。 例として以下の2つの配列を考えます: