C++で配列内を移動した後の左ポインタのインデックスを求める方法
この問題では、サイズNの配列arr[]が与えられ、配列内で可能な移動を行った後の左ポインタのインデックスを求めることが課題となります。
配列には2つのポインタ、すなわち左ポインタと右ポインタが用意されています。
左ポインタはインデックス0から開始し、値は増加していきます。
右ポインタはインデックス(n-1)から開始し、値は減少していきます。
ポインタの値は、通過した合計値がもう一方より小さい場合に増加します。つまり、左ポインタの合計が右ポインタの合計より小さければ左ポインタが増加し、そうでなければ右ポインタが減少します。そして合計値は更新されます。
問題を理解するための例
入力 : arr[] = {5, 6, 3, 7, 9, 4}
出力 : 2説明 −
leftPointer = 0 -> 合計 = 5, rightPointer = 5 -> 合計 = 4. 右ポインタを移動 leftPointer = 0 -> 合計 = 5, rightPointer = 4 -> 合計 = 13. 左ポインタを移動 leftPointer = 1 -> 合計 = 11, rightPointer = 4 -> 合計 = 13. 左ポインタを移動 leftPointer = 2 -> 合計 = 14, rightPointer = 4 -> 合計 = 13. 右ポインタを移動 leftPointer = 2 -> 合計 = 14, rightPointer = 3 -> 合計 = 20. 右ポインタを移動 左ポインタの位置は 2 となります。
解決アプローチ
この問題のシンプルな解決方法は、合計値に基づいて左ポインタと右ポインタを移動させることです。そして、左ポインタが右ポインタより1つ大きくなったかどうかを確認します。
実装例
以下は、この解決方法の動作を示すプログラムです。
#include <iostream>
using namespace std;
int findIndexLeftPointer(int arr[], int n) {
if(n == 1)
return 0;
int leftPointer = 0,rightPointer = n-1,leftPointerSum = arr[0], rightPointerSum = arr[n-1];
while (rightPointer > leftPointer + 1) {
if (leftPointerSum < rightPointerSum) {
leftPointer++;
leftPointerSum += arr[leftPointer];
}
else if (leftPointerSum > rightPointerSum) {
rightPointer--;
rightPointerSum += arr[rightPointer];
}
else {
break;
}
}
return leftPointer;
}
int main() {
int arr[] = { 5, 6, 3, 7, 9, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"移動後の左ポインタのインデックスは "<<findIndexLeftPointer(arr, n);
return 0;
}出力
移動後の左ポインタのインデックスは 2
このアルゴリズムの時間計算量はO(N)であり、各要素は最大で1回ずつ訪問されるため、効率的な解法となっています。両ポインタが交差するか隣接するまで、合計値の比較に基づいて移動を繰り返すことで、最終的な左ポインタの位置を求めることができます。
-
C++で二分木の左側の葉ノードの合計を求める方法
ルートノードとその左の子・右の子を持つ二分木を考えます。この記事での課題は、親ノードから見て左側の子となっている葉ノード(左葉ノード)の値の合計を求めることです。 例 入力: 出力: 15 説明: 入力された二分木において、親に対して左の子となっている葉ノードは 9、4、2 の3つです。したがって合計は 9+4+2 = 15 となり、出力は 15 になります。 この問題へのアプローチ 二分木が与えられたとき、親に対して左の子となっているすべての葉ノードの合計を求めるのが目的です。 この問題は再帰を使うことで効率的に解けます。基本的な考え方は次のとおりです。まず現在のノードの左の子が存在するか
-
C++でポインタ演算を使って配列要素の合計を求める方法
この記事では、C++においてポインタ演算を利用して配列要素の合計を求めるプログラムを紹介します。C++では配列名は先頭要素へのポインタとして扱えるため、*(ptr + i) のように記述することで、添字演算子を使わずに各要素へアクセスできます。 アルゴリズム 開始 ユーザーからの入力値で配列要素を初期化する 合計を格納する変数 s を 0 で初期化する i = 0 から 6 まで繰り返す s = s + *(ptr + i) 変数 s に格納された合計値を出力する 終了 サンプルコード #include<iostream> using