C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++を使って行列内で合計が最大の列を見つける方法

ここでは、サイズ M × N の行列が与えられたときに、要素の合計が最大となる列を見つける方法を解説します。

この問題では、難しいアルゴリズムを用いる必要はありません。行列を列方向に走査して各列の合計値を計算し、その合計が最大であれば、合計値と該当する列のインデックスを出力するというシンプルなアプローチで十分です。

アルゴリズムの手順

処理の流れは以下の通りです。

1. 最大合計値を格納する変数 maxSumINT_MIN で初期化し、列のインデックスを格納する index を -1 に設定します。
2. 各列(0 ~ N-1)について、colSum 関数を使ってその列の要素の合計を計算します。
3. 計算した合計が maxSum より大きければ、maxSumindex を更新します。
4. すべての列を走査し終えたら、最大の合計値とその列のインデックスを出力します。

サンプルコード

#include<iostream>
#define M 5
#define N 5
using namespace std;
int colSum(int colIndex, int mat[M][N]){
   int sum = 0;
   for(int i = 0; i<M; i++){
      sum += mat[i][colIndex];
   }
   return sum;
}
void maxColumnSum(int mat[M][N]) {
   int index = -1;
   int maxSum = INT_MIN;
   for (int i = 0; i < N; i++) {
      int sum = colSum(i, mat);
      if (sum > maxSum) {
         maxSum = sum;
         index = i;
      }
   }
   cout << "Index: " << index << ", Column Sum: " << maxSum;
}
int main() {
   int mat[M][N] = {
      { 1, 2, 3, 4, 5 },
      { 5, 3, 1, 4, 2 },
      { 5, 6, 7, 8, 9 },
      { 0, 6, 3, 4, 12 },
      { 9, 7, 12, 4, 3 },
   };
   maxColumnSum(mat);
}

実行結果

Index: 4, Column Sum: 31

この例では、5 行 5 列の行列の中で最も合計が大きいのはインデックス 4 の列(0 番目から数えて 5 列目)であり、その合計値は 31 となります。各列の合計はそれぞれ「20」「24」「26」「24」「31」であり、この中で最大となるのが最後の列です。

計算量について

このプログラムの時間計算量は O(M × N) です。すべての列について各行の要素を一度ずつ参照するためです。また、追加のメモリは定数個の変数のみを使用するため、空間計算量は O(1) となります。

  1. C++で二分木の最大垂直和を求める方法

    はじめに二分木が与えられたとき、垂直順序走査における各垂直列のノード値の合計を計算し、その中から最大値を求めて出力するのが本記事の課題です。例として、以下のような二分木を考えてみましょう。この二分木を垂直順序走査すると、各列の合計は次のようになります。4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9各列の合計の中で最大となるのは 12 です。アルゴリズムの考え方アプローチはシンプルです。幅優先探索(BFS)を用いて垂直順序走査を行い、各ノードに水平距離を割り当てます。ルートの水平距離を 0 とし、左に移動するごとに -1、右に移動するごとに +1 とします。同じ水平距離を持つ

  2. C++で行列の各列の最大要素を見つける方法

    行列が与えられたとき、その行列の各列の最大要素を見つけて出力するのが本記事の目的です。このタスクは非常にシンプルで、各列ごとに最大値を初期化し、列内のすべての要素を順に比較しながら最大値を更新していくだけです。それでは、理解を深めるために実際のコードを見ていきましょう。アルゴリズムの考え方基本的な手順は以下の通りです。列を表すインデックス i を 0 から cols-1 まで順に走査します。各列の処理を開始する際に、最大値をその列の先頭要素 mat[0][i] で初期化します。行を表すインデックス j を 1 から rows-1 まで走査し、mat[j][i] が現在の最大値より大きければ最大