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

C++で特定の配列のすべての一意のサブ配列の合計の合計を検索


この問題では、n個の整数値で構成される配列arr[]が与えられます。私たちのタスクは、特定の配列のすべての一意のサブ配列の合計を見つけることです。 。サブアレイの合計は、指定されたサブアレイの要素の合計です。

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

Input : arr[] = {1, 2, 4}
Output : 23

説明

All subarrays of the given array are :
(1), (2), (4), (1, 2), (2, 4), (1, 2, 4)
Sum of subarrays = 1 + 2 + 4 + (1+2) + (2+4) + (1+2+4) = 23

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

この問題の解決策は、サブ配列の合計を保存し、それらを並べ替えて一意のものを1回見つけることです。次に、合計のすべての一意のサブ配列を検討します。

アルゴリズム

ステップ1 −すべてのサブ配列の合計を見つけて、ベクトルに格納します。

ステップ2 −ベクトルを並べ替えます。

ステップ3 −一意であるすべてのベクトルを考慮し、残りの合計を0にマークします。

ステップ4 −合計を計算して印刷します。

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

#include <bits/stdc++.h>
using namespace std;
long int findSumOfSubArraySum(int arr[], int n){
   int i, j;
   long int sumArrayTill[n + 1] = { 0 };
   for (i = 0; i < n; i++)
      sumArrayTill[i + 1] = sumArrayTill[i] + arr[i];
   vector<long int> subArraySum;
   for (i = 1; i <= n; i++)
      for (j = i; j <= n; j++)
        subArraySum.push_back(sumArrayTill[j] - sumArrayTill[i - 1]);
   sort(subArraySum.begin(), subArraySum.end());
   for (i = 0; i < subArraySum.size() - 1; i++){
      if (subArraySum[i] == subArraySum[i + 1]) {
         j = i + 1;
         while (subArraySum[j] == subArraySum[i] && j < subArraySum.size()){
            subArraySum[j] = 0; j++;
         }
         subArraySum[i] = 0;
      }
   }
   long sum = 0;
   for (i = 0; i < subArraySum.size(); i++)
      sum += subArraySum[i];
   return sum;
}
int main(){
   int arr[] = { 1, 2, 4, 7, 9 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The sum of all unique subarray sum is "<<findSumOfSubArraySum(arr, n);
   return 0;
}

出力

The sum of all unique subarray sum is 144

反復を使用する別のアプローチ

この問題を解決する別のアプローチは、ハッシュテーブルを使用することです。サブアレイの合計を見つけてハッシュテーブルに格納し、ハッシュカウントをインクリメントします。次に、すべての一意のサブアレイ(ハッシュカウントが1のサブアレイ)の合計を求めます。

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

#include <bits/stdc++.h>
using namespace std;
long int findSumOfSubArraySum(int arr[], int n){
   int sumSubArraySum = 0;
   unordered_map<int, int> sumSubArray;
   for (int i = 0; i < n; i++) {
      int sum = 0;
      for (int j = i; j < n; j++) {
         sum += arr[j];
         sumSubArray[sum]++;
      }
   }
   for (auto itr : sumSubArray)
      if (itr.second == 1)
         sumSubArraySum += itr.first;
      return sumSubArraySum;
}
int main(){
   int arr[] = { 1, 2, 4, 7, 5 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The sum of all unique subarray sum is "<<findSumOfSubArraySum(arr, n);
   return 0;
}

出力

The sum of all unique subarray sum is 124

  1. C++で特定の二分木にあるすべての左葉の合計を求めます

    この問題では、二分木が与えられます。私たちのタスクは、特定の二分木に残っているすべての葉の合計を見つけることです 。 問題を理解するために例を見てみましょう 入力: 出力:11 説明 − All leaf nodes of the tree are : 2, 9 Sum = 2 + 9 = 11 ソリューションアプローチ この問題の簡単な解決策は、ツリーをルートからリーフにトラバースすることです。ノードが左リーフノードの場合は、合計に追加します。ツリー全体がトラバースされるとき。合計を印刷します。 例 ソリューションの動作を説明するプログラム #include <i

  2. C++で与えられた完全な二分木のすべてのノードの合計を見つけます

    完全な二分木のレベル数を表す正の整数Lがあるとします。この完全な二分木のリーフノードには、1からnまでの番号が付けられています。ここで、nはリーフノードの数です。親ノードは子の合計です。私たちの仕事は、この完璧な二分木のすべてのノードの合計を出力するプログラムを書くことです。したがって、ツリーが以下のようになっている場合- したがって、合計は30です。 よく見ると、すべてのノードの合計を見つける必要があります。リーフノードは1からnまでの値を保持しているため、式n(n + 1)/2を使用してリーフノードの合計を取得できます。これは完全な二分木であるため、各レベルの合計は同じになります