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

C ++でサイズkのサブアレイの最大(または最小)合計を求めます


この問題では、配列arr[]と数kが与えられます。私たちのタスクは、サイズkのサブアレイの最大(または最小)合計を見つけることです。

問題を理解するために例を見てみましょう。

入力: arr [] ={55、43、12、76、89、25、99}、k =2

出力: 165

説明:

サイズ2のサブアレイの合計は=76+ 89 =165

ソリューションアプローチ

この問題を解決する簡単な方法は、kサイズのサブ配列をすべて見つけて、最大値の合計を返すことです。

別のアプローチ スライディングウィンドウを使用しています kサイズのサブアレイの合計が見つかります。このために、次のkサイズのサブ配列では、最後のインデックス要素を減算し、次のインデックス要素を追加します。

次に、最大値を持つサブ配列の合計を返します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;

int findMaxSumSubarray(int arr[], int n, int k) {
   
   if (n < k) {
      cout << "Invalid";
      return -1;
   }

   int maxSum = 0;
   for (int i=0; i<k; i++)
      maxSum += arr[i];
   int curr_sum = maxSum;
   for (int i=k; i<n; i++) {
      curr_sum += arr[i] - arr[i-k];
      maxSum = max(maxSum, curr_sum);
   }
   return maxSum;
}

int main() {
   
   int arr[] = {55, 43, 12, 76, 89, 25, 99};
   int n = sizeof(arr)/sizeof(arr[0]);
   int k = 2;
   cout<<"The sum of subarray with max sum of size "<<k<<" is "<<findMaxSumSubarray(arr, n, k);
   return 0;
}

出力

The sum of subarray with max sum of size 2 is 165

  1. C++の二分木で最大垂直和を見つける

    二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace

  2. 二分探索アプローチを使用して最大サブアレイ合計を見つけるC++プログラム

    二分探索は、実行時の複雑さがΟ(log n)の高速検索アルゴリズムです。この検索アルゴリズムは、分割統治の原則に基づいて機能します。このアルゴリズムが正しく機能するためには、データ収集がソートされた形式である必要があります。 バイナリ検索は、コレクションの真ん中のアイテムを比較することによって特定のアイテムを検索します。一致する場合は、アイテムのインデックスが返されます。中央のアイテムがアイテムよりも大きい場合、そのアイテムは中央のアイテムの左側にあるサブ配列で検索されます。それ以外の場合、アイテムは中央のアイテムの右側のサブ配列で検索されます。このプロセスは、サブアレイのサイズがゼロになる