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

C++で合計がkより大きい最大のサブ配列


このチュートリアルでは、最大のサブ配列の合計がkより大きいことを検出するプログラムを作成します。

問題を解決するための手順を見てみましょう。

  • アレイを初期化します。
  • 配列を反復処理し、各インデックスの合計をインデックスとともにベクトルに格納します。
  • 合計とインデックスに基づいて上記の合計を並べ替えます。
  • 配列を初期化してインデックスを格納します。
  • nまで繰り返すループを作成します。
    • 上記のインデックス配列の最小インデックスと以前の合計配列インデックスで値を更新します。
  • 合計を0に初期化します。
  • nまで繰り返すループを作成します。
    • 現在の要素を合計に追加します。
    • 合計がkより大きい場合。
      • サブアレイの最大長はi+1です。
    • それ以外の場合、サブアレイの最大長は
      • 二分探索を使用して、以前の合計からインデックスを検索します。
      • sum --k --1未満の合計は、必要な要素インデックスです。

コードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
bool compare(const pair<int, int>& a, const pair<int, int>& b) {
   if (a.first == b.first) {
      return a.second < b.second;
   }
   return a.first < b.first;
}
int findIndex(vector<pair<int, int> >& previousSums, int n, int val) {
   int start = 0;
   int end = n - 1;
   int mid, result = -1;
   while (start <= end) {
      mid = (start + end) / 2;
      if (previousSums[mid].first <= val) {
         result = mid;
         start = mid + 1;
      }else {
         end = mid - 1;
      }
   }
   return result;
}
int getLargestSubArray(int arr[], int n, int k) {
   int maxLength = 0;
   vector<pair<int, int> > previousSums;
   int sum = 0, minIndexes[n];
   for (int i = 0; i < n; i++) {
      sum = sum + arr[i];
      previousSums.push_back({ sum, i });
   }
   sort(previousSums.begin(), previousSums.end(), compare);
   minIndexes[0] = previousSums[0].second;
   for (int i = 1; i < n; i++) {
      minIndexes[i] = min(minIndexes[i - 1], previousSums[i].second);
   }
   sum = 0;
   for (int i = 0; i < n; i++) {
      sum = sum + arr[i];
      if (sum > k) {
         maxLength = i + 1;
      }else {
         int ind = findIndex(previousSums, n, sum - k - 1);
         if (ind != -1 && minIndexes[ind] < i) {
            maxLength = max(maxLength, i - minIndexes[ind]);
         }
      }
   }
   return maxLength;
}
int main() {
   int arr[] = { 5, 3, -3, 2, 4, 7 };
   int k = 5, n = 6;
   cout << getLargestSubArray(arr, n, k) << endl;
   return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

6

結論

チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。


  1. C++でのmを法とする最大サブアレイ合計

    この問題では、サイズnと整数mの配列が与えられます。私たちのタスクは、C++でmを法とする最大のサブ配列の合計を見つけるプログラムを作成することです。 プログラムの説明 −ここでは、サブアレイのすべての要素の合計をmで割った値を求めます。 問題を理解するために例を見てみましょう 入力 −配列={4、9、2} m =6 出力 − 5 説明 −すべてのサブ配列と除算の余り {4}: 4%6 = 4 {9}: 9%6 = 3 {2}: 2%6 = 2 {4, 9}: 13%6 = 1 {9, 2}: 11%6 = 5 {4, 9, 2}: 15%6 = 3 この問題を解決するために、

  2. 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で更新します。