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

Pythonで配列を等しい合計のサブ配列に分割できる合計を見つけます


整数Aの配列があるとします。値sum[i]の場合、配列をsum sum [i]のサブ配列に分割できるように、sumのすべての値を見つける必要があります。配列を等しい合計のサブ配列に分割できない場合は、-1を返します。

したがって、入力がA =[2、4、2、2、2、4、2、6]のような場合、配列は次のサブ配列に分割できるため、出力は[6,8,12]になります。合計6、8、および12。これらは次のとおりです。[{2、4}、{2、2、2}、{4、2}、{6}] [{2、4、2}、{2、2 、4}、{2、6}] [{2、4、2、2、2}、{4、2、6

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

  • n:=a

    のサイズ
  • table:=サイズnで、0で埋められた配列

  • table [0]:=a [0]

  • 1からnの範囲のiの場合、実行します

    • table [i]:=a [i] + table [i-1]

  • S:=table [n-1]

  • my_map:=新しいマップ

  • 0からnの範囲のiの場合、実行

    • my_map [table [i]]:=1

  • 答え:=新しいセット

  • 範囲1から((S)の平方根)+ 1の整数部分のiの場合、do

    • S mod iが0と同じ場合、

      • is_present:=True

      • part_1:=i

      • part_2:=S/iの商

      • part_1からS+1の範囲のjについては、各ステップでpart_1ごとに更新します。

        • jがmy_mapにない場合は、

          • is_present:=False

          • ループから出てきます

      • is_presentがtrueで、part_1がSと同じでない場合、

        • 回答のadd(part_1)

      • is_present:=True

      • (S / i)からS + 1までの範囲の商のjについては、各ステップでS // i、do

        で更新します。
        • jがmy_mapにない場合は、

          • is_present:=False;

          • ループから出てきます

      • is_presentおよびpart_2がSと同じでない場合、

        • 回答のadd(part_2)

  • 回答のサイズが0と同じ場合、

    • -1を返す

  • 回答を返す

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

from math import sqrt
def find_sum(a) :
   n = len(a)
   table = [0] * n
   table[0] = a[0]
   for i in range(1, n) :
      table[i] = a[i] + table[i - 1]
   S = table[n - 1]
   my_map = {}
   for i in range(n) :
      my_map[table[i]] = 1
   answer = set()
   for i in range(1, int(sqrt(S)) + 1) :
      if (S % i == 0) :
         is_present = True;
         part_1 = i
         part_2 = S // i
         for j in range(part_1 , S + 1, part_1) :
            if j not in my_map :
               is_present = False
               break
         if (is_present and part_1 != S) :
            answer.add(part_1)
         is_present = True
         for j in range(S // i , S + 1 , S // i) :
            if j not in my_map:
               is_present = False;
               break
         if (is_present and part_2 != S) :
            answer.add(part_2)
   if(len(answer) == 0) :
      return -1
   return answer
a = [2, 4, 2, 2, 2, 4, 2, 6]
print(find_sum(a))

入力

[2, 4, 2, 2, 2, 4, 2, 6]

出力

{8, 12, 6}

  1. 配列の合計を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力として配列が与えられた場合、与えられた配列の合計を計算する必要があります。 ここでは、ブルートフォースアプローチに従うことができます。つまり、リストをトラバースし、各要素を空の合計変数に追加します。最後に、合計の値を表示します。 以下で説明するように、組み込みの合計関数を使用して別のアプローチを実行することもできます。 例 # main arr = [1,2,3,4,5] ans = sum(arr,n) print ('Sum of the array is '

  2. nで割った配列乗算のリマインダーを見つけるためのPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します- 問題の説明 複数の数値と数値入力nが与えられた場合、除算可能なすべての数値にnを掛けた後、余りを出力する必要があります。 アプローチ まず、arr [i]%nのように余りを計算します。次に、この余りに現在の結果を掛けます。 乗算後、オーバーフローを避けるために同じ余りを取ります。これは、モジュラー演算の分配法則に準拠しています。 ( a * b) % c = ( ( a % c ) * ( b % c ) ) % c 例 def findremainder(arr, lens, n):   &n