C++で行列内の合計が最大となる行を見つける方法
この問題では、N×N のサイズを持つ行列 mat[][] が与えられ、その中から要素の合計が最大となる行を見つけることが課題となります。
問題を理解するための例
入力
mat[][] = {
8, 4, 1, 9
3, 5, 7, 9
2, 4, 6, 8
1, 2, 3, 4
}出力
Row 2, sum 24
説明
各行の合計を計算すると以下のようになります。
行1: 合計 = 8+4+1+9 = 22 行2: 合計 = 3+5+7+9 = 24 行3: 合計 = 2+4+6+8 = 20 行4: 合計 = 1+2+3+4 = 10
この中で最も合計が大きいのは行2(合計 24)であるため、これが答えとなります。
解法のアプローチ
この問題に対するシンプルな解決策は、各行の要素の合計を順番に計算し、その最大値を記録していくというものです。
具体的には、次の手順で処理を行います。
- 現在の最大合計(maxSum)を初期化する。
- 各行について、その行に含まれるすべての要素の合計を求める。
- 計算した合計が現在の最大値より大きければ、最大値とその行のインデックスを更新する。
- すべての行を走査し終えたら、最大の合計を持つ行を出力する。
解法の実装例
以下は、この解法の動作を示す C++ プログラムです。
#include <iostream>
using namespace std;
#define R 4
#define C 4
void findMax1Row(int mat[R][C]) {
int maxSumRow = 0, maxSum = -1;
int i, index;
for (i = 0; i < R; i++) {
int sum = 0;
for(int j = 0; j < C; j++){
sum += mat[i][j];
}
if(sum > maxSum){
maxSum = sum;
maxSumRow = i;
}
}
cout<<"Row : "<<(maxSumRow+1)<<" has the maximum sum which is "<<maxSum;
}
int main() {
int mat[R][C] = {
{8, 4, 1, 9},
{3, 5, 7, 9},
{2, 4, 6, 8},
{1, 2, 3, 4}
};
findMax1Row(mat);
return 0;
}出力
Row : 2 has the maximum sum which is 24
計算量について
このアルゴリズムは、行列のすべての要素を一度ずつ参照するため、時間計算量は O(N²) となります。ここで N は行列の行数(および列数)です。空間計算量は追加の配列などを必要としないため O(1) です。
このように、各行の合計を逐次的に比較していくだけで、効率的に合計が最大の行を特定することができます。
-
C++で二分木の最大レベル和を求める方法
問題概要 この問題では、正と負の値を含む二分木が与えられます。私たちのタスクは、二分木におけるレベル和の最大値を見つけることです。 問題の説明: 与えられた二分木に対して、各レベルに存在するすべてのノードの値の合計を計算し、その中で最も大きい値を返します。 具体例を使って問題を理解しましょう。 入力: 出力: 5 説明: レベル1の要素の合計:3 レベル2の要素の合計:-3 + 4 = 1 レベル3の要素の合計:5 - 1 + 6 - 5 = 5 各レベルの合計は「3」「1」「5」となるため、最大のレベル和は 5 となります。 解法アプローチ この問題を効率的に解くには、レベル順走査(幅優先
-
C++を使って行列内で合計が最大の列を見つける方法
ここでは、サイズ M × N の行列が与えられたときに、要素の合計が最大となる列を見つける方法を解説します。この問題では、難しいアルゴリズムを用いる必要はありません。行列を列方向に走査して各列の合計値を計算し、その合計が最大であれば、合計値と該当する列のインデックスを出力するというシンプルなアプローチで十分です。アルゴリズムの手順処理の流れは以下の通りです。1. 最大合計値を格納する変数 maxSum を INT_MIN で初期化し、列のインデックスを格納する index を -1 に設定します。2. 各列(0 ~ N-1)について、colSum 関数を使ってその列の要素の合計を計算します。3