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

C ++のプレフィックス合計を使用したO(n)の最大サブ配列合計


問題の説明

正の整数と負の整数の配列が与えられた場合、その配列の最大サブ配列の合計を求めます

入力配列が− {-12、-5、4、-1、-7、1、8、-3}の場合、出力は9

アルゴリズム

  • 入力配列のプレフィックス合計を計算します。

  • Initialize− min_prefix_sum =0、res =-infinite

  • i=0からnまでのループを維持します。 (nは入力配列のサイズです。)

    • cand =prefix_sum [i] – mini

    • キャンドの場合 がres(これまでのサブアレイの最大合計)より大きい場合は、resをcandで更新します。

    • prefix_sum [i]がmin_prefix_sum(これまでの最小プレフィックス合計)よりも小さい場合は、prefix_sum[i]でmin_prefix_sumを更新します。

  • 解像度を返す

#include <bits/stdc++.h>
using namespace std;
int maximumSumSubarray(int *arr, int n){
   int minPrefixSum = 0;
   int res = numeric_limits<int>::min();
   int prefixSum[n];
   prefixSum[0] = arr[0];
   for (int i = 1; i < n; i++) {
      prefixSum[i] = prefixSum[i - 1] + arr[i];
   }
   for (int i = 0; i < n; i++) {
      res = max(res, prefixSum[i] - minPrefixSum);
      minPrefixSum = min(minPrefixSum, prefixSum[i]);
   }
   return res;
}
int main(){
   int arr[] = {-12, -5, 4, -1, -7, 1, 8, -3};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Result = " << maximumSumSubarray(arr, n) <<endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Result = 9

  1. C++で分割統治アルゴリズムを使用した最大サブアレイ合計

    正の値と負の値を持つデータのリストが1つあるとします。合計が最大である連続するサブ配列の合計を見つける必要があります。リストに{-2、-5、6、-2、-3、1、5、-6}が含まれているとすると、最大サブ配列の合計は7になります。これは{6、-2、-3の合計です。 、1、5} この問題は、分割統治法を使用して解決します。手順は次のようになります- 手順 − アレイを2つの部分に分割します 次の3つのうち最大のものを見つけます 左側のサブアレイの最大サブアレイ合計 右サブアレイの最大サブアレイ合計 サブアレイが中点を横切るようなサブアレイの最大合計 例 #include <i

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

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