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

C++で合計が等しい配列を分割


n個の整数の配列があるとすると、これらの条件に従うトリプレット(i、j、k)があるかどうかを確認する必要があります-

  • 0

  • サブ配列の合計(0、i-1)、(i + 1、j-1)、(j + 1、k-1)、および(k + 1、n-1)は同じになります。

サブ配列(L、R)は、Lでインデックス付けされた要素からRでインデックス付けされた要素までの元の配列のスライスです。

したがって、入力が[1,2,1,2,1,2,1]の場合、i =1、j =3、k =5のように、出力はTrueになります。

sum(0, i - 1) = 1 sum(0, 0) = 1
sum(i + 1, j - 1) = 1 sum(2, 2) = 1
sum(j + 1, k - 1) = 1 sum(4, 4) = 1
sum(k + 1, n - 1) = 1 sum(6, 6) = 1

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

  • n:=numsのサイズ

  • サイズnの配列の合計を定義します

  • sums [0]:=nums [0]

  • 初期化i:=1の場合、i

    • sums [i]:=sums [i] +(nums [i] + sums [i-1])

  • 初期化j:=3の場合、j − nの場合、更新(jを1増やします)、実行-

    • 1つのセットを定義する

    • 初期化i:=1の場合、i

      • sum1:=sums [i-1]

      • sum2:=sums [j --1] --sums [i]

      • sum1がsum2と同じ場合、-

        • sum1をsに挿入します

    • 初期化k:=j + 2の場合、k

      • sum1:=sums [k --1] --sums [j]

      • sum2:=sums [n --1] --sums [k]

      • sum1がsum2と同じで、sum1がsにある場合、-

        • trueを返す

  • falseを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool splitArray(vector<int>& nums) {
      int n = nums.size();
      vector<int> sums(n);
      sums[0] = nums[0];
      for (int i = 1; i < n; i++) {
         sums[i] += (nums[i] + sums[i - 1]);
      }
      for (int j = 3; j < n; j++) {
         set<int> s;
         for (int i = 1; i < j - 1; i++) {
            int sum1 = sums[i - 1];
            int sum2 = sums[j - 1] - sums[i];
            if (sum1 == sum2)
               s.insert(sum1);
         }
         for (int k = j + 2; k < n - 1; k++) {
            int sum1 = sums[k - 1] - sums[j];
            int sum2 = sums[n - 1] - sums[k];
            if (sum1 == sum2 && s.count(sum1))
               return true;
            }
         }
         return false;
      }
};
main(){
   Solution ob;
   vector<int> v = {1,2,1,2,1,2,1};
   cout << (ob.splitArray(v));
}

入力

{1,2,1,2,1,2,1}

出力

1

  1. C++合計配列パズル

    配列 同じデータ型の複数の要素を格納するデータ構造です。値のセット全体を一度に保存できます。ただし、その長さは事前に定義する必要があります。 この合計配列パズルでは、nと言う明確なサイズの配列A1が与えられます。このパズルを解くために、位置が使用されている要素を除く配列のすべての要素の合計を格納するS1という配列を作成します。たとえば、S1 [3]が計算されている場合、位置4の要素を除くA1のすべての要素の合計が求められます。 例- Array A1 = {1,2,3,4,6} Output S1 = {15,14,13,12,10} 説明 −合計配列を計算するには、初期配列の各要素を合計

  2. C ++の合計配列パズル?

    ここでは、配列に関連する1つの興味深い問題を確認します。 n個の要素を持つ配列があります。 n個の要素の別の配列を作成する必要があります。ただし、2番目の配列のi番目の位置は、i番目の要素を除く最初の配列のすべての要素の合計を保持します。そして、1つの制約は、この問題では減算演算子を使用できないことです。 減算演算を使用できれば、すべての要素の合計を取得し、最初の配列のi番目の要素を減算して、2番目の配列のi番目の場所に格納することで、この問題を簡単に解決できます。 ここでは、毎回要素を追加することでこれを解決し、0..n-1のiについては、位置iの要素を無視します。ポイントを得るためのア