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

C ++で指定された合計のサブ配列を検索-(負の数を処理)


この問題では、ソートされていない順序で格納されたN個の整数で構成される配列arr[]が与えられます。私たちのタスクは、指定された合計のサブ配列を見つけることです。 。

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

Input : arr[] = {2, 5, -1, 4, 6, -9, 5} sum = 14
Output : subarray = {5, -1, 4, 6}

説明

Subarray sum = 5 - 1 + 4 + 6 = 14

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

この問題の簡単な解決策は、ネストされたループを使用することです。配列をループし、内部ループを使用して、サブ配列を見つけます。サブアレイごとに、すべての要素の合計を見つけて、指定された合計値と比較します。等しい場合は、サブ配列を出力します。配列のすべての要素がトラバースされた場合、そのような配列は見つかりませんでした。

アルゴリズム

  • ステップ1 −配列をループします。i-> 0から(n-1)。

    • ステップ1.1 −各要素について、考えられるすべてのサブアレイの各サブアレイの合計を求めます。

    • ステップ1.2 −現在の合計配列要素の合計が指定されたサブ配列と等しい場合は、サブ配列を出力します。

  • ステップ2 −配列のすべての要素がトラバースされ、サブ配列が見つからない場合。 「指定された合計のサブ配列が見つかりません!」と出力します。

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

#include <bits/stdc++.h>
using namespace std;
void printSubArray(int arr[], int i, int j){
   cout<<"{ ";
      for(; i < j; i++)
      cout<<arr[i]<<" ";
   cout<<"}";
}
int findSubArrayWithSum(int arr[], int n, int sum) {
   int currSum;
   for (int i = 0; i < n; i++) {
      currSum = arr[i];
      for (int j = i + 1; j <= n; j++) {
         if (currSum == sum) {
            cout<<"Subarray with given sum : ";
            printSumArray(arr, i, j);
            return 1;
         }
         if (currSum >sum || j == n)
         break;
         currSum = currSum + arr[j];
      }
   }
   cout<<"No subarray found";
   return 0;
}
int main() {
   int arr[] = { 2, 5, -1, 4, 6, -9, 3};
   int n = sizeof(arr) / sizeof(arr[0]);
   int sum = 14;
   findSubArrayWithSum(arr, n, sum);
   return 0;
}

出力

Subarray with given sum : { 5 -1 4 6 }

問題を解決するためのより良いアプローチは、ハッシュマップを使用することです。ハッシュマップは、現在のインデックスまでプレフィックスの合計を格納します。また、インデックスについては、sumを含むサブ配列が存在するかどうかを確認してください。 sum=sum--valueのプレフィックスがあるかどうかを確認します。

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

#include <bits/stdc++.h>
using namespace std;
void printSubArray(int arr[], int i, int j){
   cout<<"{ ";
      for(; i <= j; i++)
      cout<<arr[i]<<" ";
   cout<<"}";
}
void findSubArrayWithSum(int arr[], int n, int sum) {
   unordered_map<int, int> map;
   int curr_sum = 0;
   for (int i = 0; i < n; i++){
      curr_sum = curr_sum + arr[i];
      if (curr_sum == sum) {
         cout<<"SubArray with the given sum :";
         printSubArray(arr, 0, i);
         return;
      }
      if (map.find(curr_sum - sum) != map.end()) {
         cout<<"SubArray with the given sum : ";
         printSubArray(arr, map[curr_sum - sum] + 1 , i);
         return;
      }
      map[curr_sum] = i;
   }
   cout<<"No subarray found!";
}
int main() {
   int arr[] = { 2, 5, -1, 4, 6, 9, 3};
   int n = sizeof(arr) / sizeof(arr[0]);
   int sum = 14;
   findSubArrayWithSum(arr, n, sum);
   return 0;
}

出力

SubArray with the given sum : { 5 -1 4 6 }

  1. C++で指定された合計を持つ4つ組の数

    4つの配列が与えられます。目標は、指定された合計値に等しい合計を持つ4つの配列から要素の4つ組を見つけることです。選択する要素は、4つの要素すべてが異なる配列に属するようなものである必要があります。 これを行うには、forループを使用してすべての配列をトラバースし、A [i] + B [j] + C [k] + D [l]==sumかどうかを確認します。はいの場合、カウントをインクリメントします。 例を挙げて理解しましょう- 入力 − A[]={ 1,3,1}, B[]={ 2,4,5 } , C[]={ 1,1,2 } , D[]= { 4,4,0} Sum=5 出力 −与えられた

  2. C++で指定されたインデックスを持つNフィボナッチ数のGCDを検索します

    ここでは、指定されたインデックスを持つn個のフィボナッチ項のGCDを見つける必要があります。したがって、最初に最大インデックスを取得し、フィボナッチ項を生成する必要があります。いくつかのフィボナッチ項は次のようになります:0、1、1、2、3、5、8、13、21、34、…..インデックスは開始です0から。したがって、0 thの要素 インデックスは0です。インデックス{2、3、4、5}でフィボナッチ項のgcdを見つける必要がある場合、項は{1、2、3、4}であるため、これらの数値のGCDは1です。 このタスクを実行するために、1つの興味深いアプローチを使用します。 GCD(Fibo(i)、Fi