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

C++でKで割り切れるサブアレイの合計


整数の配列Aがあるとします。合計がkで割り切れる、連続する空でないサブアレイの数を見つける必要があります。 A =[4,5,0、-2、-3,1]およびk =5の場合、出力は7になります。7つのサブ配列があります。 [[4,5,0、-2、-3,1]、[5]、[5,0]、[5,0、-2、-3]、[0]、[0、-2、- 3]、[-2、-3]]

これを解決するには、次の手順に従います-

  • 1つのマップmを作成し、m[0]を1に設定します
  • temp:=0、ans:=0、およびn:=配列のサイズa
  • 0からn–1の範囲のiの場合
    • temp:=temp + a [i]
    • x:=(temp mod k + k)mod k
    • ans:=ans + m [x]
    • m[x]を1増やします
  • 回答を返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int subarraysDivByK(vector<int>& a, int k) {
      unordered_map <int, int> m;
      m[0] = 1;
      int temp = 0;
      int ans = 0;
      int n = a.size();
      for(int i = 0; i < n; i++){
         temp += a[i];
         int x = (temp % k + k) % k;
         ans += m[x];
         m[x]++;
      }
      return ans;
   }
};
main(){
   vector<int> v = {4,5,0,-2,-3,1};
   Solution ob;
   cout <<(ob.subarraysDivByK(v, 5));
}

入力

[4,5,0,-2,-3,1]
5

出力

7

  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 ++でサブ配列を反転して、0の数を最大化します

    問題の説明 バイナリ配列が与えられた場合、サブ配列の1回の反転が許可されている配列内のゼロの最大数を見つけます。フリップ操作は、すべての0を1に、1を0に切り替えます arr1 ={1、1、0、0、0、0、0}の場合 最初の21を0に反転すると、次のようにサイズ7のサブ配列を取得できます- {0, 0, 0, 0, 0, 0, 0} アルゴリズム 1. Consider all subarrays and find a subarray with maximum value of (count of 1s) – (count of 0s) 2. Considers this