C++で配列内の隣接ペア要素の積をすべて求める方法
問題概要
n個の整数からなる配列 arr[n] が与えられたとき、隣接する2つの要素(ペア)の積をすべて求めるのが課題です。
配列 arr[] における「隣接要素」とは、i番目の要素 arr[i] に着目したとき、直後の要素 arr[i+1] または直前の要素 arr[i-1] を指します。したがって、求める積は arr[i] × arr[i+1]、あるいは arr[i] × arr[i-1] となります。
入力例 1
arr[] = {1, 2, 3, 4}出力例 1
2, 6, 12
説明
ペアに分解すると {1,2}、{2,3}、{3,4}
それぞれの結果は 1×2 = 2、2×3 = 6、3×4 = 12入力例 2
arr[] = {9, 5, 1, 2, 6, 10}出力例 2
45, 5, 2, 12, 60
説明
ペアに分解すると {9,5}、{5,1}、{1,2}、{2,6}、{6,10}
それぞれの結果は 9×5 = 45、5×1 = 5、1×2 = 2、2×6 = 12、6×10 = 60解き方のアプローチ
- 配列の先頭(0番目)から、インデックスが n-1 未満である間ループを回します。
- 各 i について arr[i] と arr[i+1] を掛け合わせ、その結果を出力します。
アルゴリズム
開始
ステップ1 → 隣接要素の積を計算する関数を宣言
void product(int arr[], int size)
int product = 1 を宣言
ループ:int i = 0、i < size - 1 の間 i++
product = arr[i] * arr[i + 1] を設定
product を出力
終了
ステップ2 → main() 内で
int arr[] = {2, 4, 6, 8, 10, 12, 14} を宣言
int size = sizeof(arr) / sizeof(arr[0]) を宣言
product(arr, size) を呼び出す
終了C++ 実装例
#include <iostream>
using namespace std;
// 隣接ペアの積を求める関数
void product(int arr[], int size){
int product = 1;
for (int i = 0; i < size - 1; i++){
product = arr[i] * arr[i + 1];
printf("%d ", product);
}
}
int main(){
int arr[] = {2, 4, 6, 8, 10, 12, 14};
int size = sizeof(arr) / sizeof(arr[0]);
printf("product is : ");
product(arr, size);
return 0;
}実行結果
上記のコードを実行すると、以下の出力が得られます。
product is : 8 24 48 80 120 168
計算量について
このアルゴリズムは配列を一度だけ走査するため、時間計算量は O(n)、追加で必要なメモリは O(1) です。要素数 n が大きくなっても線形時間で処理できる、シンプルかつ効率的な手法といえます。
-
C++で2つの二分探索木の全要素を昇順リストとして取得する方法
問題の概要2つの二分探索木(BST:Binary Search Tree)が与えられたとき、両方の木に含まれるすべての要素を昇順に並べたリストを返すことを考えます。例えば、次のような2つの二分探索木があるとします。木1:[2,1,4]木2:[1,0,3]この場合、出力は [0,1,1,2,3,4] となります。重複する値(この例では「1」)もそのまま保持される点に注意してください。解決のためのアプローチこの問題は、各BSTに対して反復的な中順走査(inorder traversal)を行い、マージソートのように2つの走査結果を統合することで効率的に解けます。手順は以下の通りです。結果を格納する
-
C++で無向グラフ内のすべてのサイクルの長さの積を求める方法
本記事では、無向かつ非重み付きグラフが入力として与えられたとき、そのグラフ内に形成されるすべてのサイクルの長さ(頂点数)の積を求め、結果を出力する方法を解説します。具体例入力例1この図では合計8つのノードがあり、そのうちノード1、6、3、5、8の5つがサイクルを形成しています。残りのノードはサイクルに含まれません。したがって、サイクルの長さは5であり、積は5となります。入力例2この図では合計12のノードがあり、そのうち11個(5個+6個)のノードが2つのサイクルを形成しています。1つ目はノード1、6、3、5、8からなるサイクル、2つ目はノード9、4、10、11、22、12からなるサイクルです。