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

C++での連続サブアレイ合計


非負の数とターゲット整数kのリストがあるとすると、配列に、合計がkの倍数、合計がn*になる少なくとも2のサイズの連続サブ配列があるかどうかを確認する関数を作成する必要があります。 kここで、nも整数です。したがって、入力が[23,2,4,6,7]のようで、k =6の場合、[2,4]はサイズ2の連続サブ配列であり、合計が6になるため、結果はTrueになります。

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

  • マップmを作成し、m [0]:=-1を設定し、sum:=0、n:=nums配列のサイズを設定します
  • 0からn–1の範囲のiの場合
    • sum:=sum + nums [i]
    • kがゼロ以外の場合、sum:=sum mod k
    • mに合計があり、i – m [sum]> =2の場合、trueを返します
    • mに合計がない場合は、m [sum]:=iを設定します
  • falseを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool checkSubarraySum(vector<int>& nums, int k) {
      unordered_map<int, int> m;
      m[0] = -1;
      int sum = 0;
      int n = nums.size();
      for(int i = 0; i < n; i++){
         sum += nums[i];
         if(k)
         sum %= k;
         if(m.count(sum) && i - m[sum] >= 2){
            return true;
         }
         if(!m.count(sum)) m[sum] = i;
      }
      return false;
   }
};
main(){
   vector<int> v = {23,2,4,6,7};
   Solution ob;
   cout << (ob.checkSubarraySum(v, 6));
}

入力

[23,2,4,6,7]
6

出力

1

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

  2. C ++でのアリコートの合計?

    ここで、アリコートの合計は何ですか? nのアリコート和は、nを除くnのすべての完全な因子の合計です。たとえば、数値が20の場合、完全な因数は(1、2、4、5、10)です。したがって、アリコートの合計は22です。 興味深い事実の1つは、ある数のアリコートの合計がその数そのものである場合、その数は完全数であるということです。たとえば、6。係数は(1、2、3)です。アリコートの合計は1+2 + 3=6です。 次のアルゴリズムを使用してアリコートの合計を取得する方法を見てみましょう。 アルゴリズム getAliquotSum(n) begin    sum := 0 &nbs