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

Pythonで最も近いサブシーケンスの合計を見つけるプログラム


配列numsと別の値の目標があるとします。要素の合計が目標に最も近くなるように、numsのサブシーケンスを選択する必要があります。つまり、サブシーケンスの要素の合計がsの場合、絶対差| s--goal|を最小化する必要があります。

したがって、| s --goal |の可能な最小値を見つける必要があります。したがって、入力がnums =[8、-8,16、-1]goal =-3の場合、出力は2になります。サブシーケンス[8、-8、-1]、合計-1。絶対差は|-1-(-3)|です。 =abs(2)=2、これは最小値です。

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

  • n:=numsのサイズ

  • xの絶対値を取得した後、-ve値に基づいて数値を並べ替える

  • neg:=サイズn + 1の配列を作成し、0で埋めます

  • pos:=サイズn + 1の配列を作成し、0で埋めます

  • n-1から0の範囲のiの場合、1ずつ減らします。

    • nums [i] <0の場合、

      • neg [i]:=neg [i + 1] + nums [i]

      • pos [i]:=pos [i + 1]

    • それ以外の場合

      • pos [i]:=pos [i + 1] + nums [i]

      • neg [i]:=neg [i + 1]

  • ans:=|目標|

  • s:=新しいセットとそれに0を挿入

  • 関数check()を定義します。これにはa、bが必要です

  • b<目標-ansまたはgoal+ans

    • Falseを返す

  • Trueを返す

  • メインの方法から、次のようにします

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

    • sl:=check(x + neg [i]、x + pos [i] true]

      の場合のs内のすべてのxのxのリスト
    • slのサイズが0と同じ場合、

      • ループから出てきます

    • s:=slからの新しいセット

    • slのxごとに、実行します

      • y:=x + nums [i]

      • |y-ゴール|の場合

        • ans:=|y-目標|

      • ansが0と同じ場合、

        • 0を返す

      • yをsに挿入します

  • ansを返す

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

from collections import Counter
def solve(nums, goal):
   n = len(nums)
   nums.sort(key=lambda x: -abs(x))
   neg = [0 for _ in range(n+1)]
   pos = [0 for _ in range(n+1)]
   for i in range(n-1, -1, -1):
      if nums[i] < 0:
         neg[i] = neg[i+1] + nums[i]
         pos[i] = pos[i+1]
      else:
         pos[i] = pos[i+1] + nums[i]
         neg[i] = neg[i+1]
   ans = abs(goal)
   s = set([0])
   def check(a, b):
      if b < goal - ans or goal + ans < a:
         return False
      return True
   for i in range(n):
      sl = [x for x in s if check(x+neg[i], x+pos[i])]
      if len(sl) == 0:
         break
      s = set(sl)
      for x in sl:
         y = x + nums[i]
         if abs(y - goal) < ans:
            ans = abs(y - goal)
         if ans == 0:
            return 0
         s.add(y)
   return ans

nums = [8,-8,16,-1]
goal = -3
print(solve(nums, goal))

入力

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

出力

2

  1. リスト内の要素の合計を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力としてリストが与えられた場合、与えられたリストの合計を計算する必要があります。 ここでは、考慮すべき2つのアプローチがあります。つまり、組み込み関数を使用する方法と、ブルートフォースアプローチを使用する方法です。 アプローチ1-組み込み関数の使用 例 # main arr = [1,2,3,4,5] ans = sum(arr) print ('Sum of the array is ',ans) 出力 15 すべての変数と関数はグローバルスコープで宣言されて

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

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