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

Pythonで配列を補完するための最小限の動きを見つけるプログラム


別の値の制限である偶数の長さの配列numがあるとします。 1回の移動で、numsの任意の値を1からlimitまでの別の値に置き換えることができます。すべてのインデックスiについて、nums [i] + nums [n-1-i]が同じ数に等しい場合、配列は相補的であると言われます。したがって、numsを補完するために必要な最小移動数を見つける必要があります。

したがって、入力がnums =[1,4,2,3] limit =4のような場合、出力は1になります。これは、1回の移動でインデックス1から2の要素を作成できるため、配列は[1,2 、2,3]、次にnums [0] + nums [3] =4、nums [1] + nums [2] =4、nums [2] + nums [1] =4、nums [3] + nums [ 0] =4

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

  • n:=numsのサイズ
  • mid:=n/2の商
  • zero_moves:=整数型の値の空のマップ
  • start:=サイズの配列(2*制限+1)、0で埋める
  • end:=サイズの配列(2*制限+1)、0で埋める
  • res:=無限大
  • 0からmid-1の範囲のiの場合、do
    • x:=nums [i]
    • y:=nums [n --1 --i]
    • zero_moves [x + y]:=zero_moves [x + y] + 1
    • start [1 +最小のx、y]を1増やします
    • end [limit + maximum of x、y]を1増やします
  • 間隔:=0
  • 範囲2から制限*2のターゲットについては、
    • 間隔:=間隔+開始[ターゲット]
    • コスト:=2 *(中間-間隔)+間隔-zero_moves[ターゲット]
    • res:=最小のresとコスト
    • 間隔:=間隔-end [target]
  • return res

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

from collections import defaultdict
def solve(nums, limit):
   n = len(nums)
   mid = n // 2

   zero_moves = defaultdict(int)

   start = [0] * (2 * limit + 1)
   end = [0] * (2 * limit + 1)
   res = float('inf')
   for i in range(mid):
      x = nums[i]
      y = nums[n - 1 - i]
      zero_moves[x + y] += 1
      start[min(x, y) + 1] += 1
      end[max(x, y) + limit] += 1

   intervals = 0
   for target in range(2, limit * 2 + 1):
      intervals += start[target]
      cost = 2 * (mid - intervals) + intervals - zero_moves[target]
      res = min(res, cost)
      intervals -= end[target]
   return res

nums = [1,4,2,3]
limit = 4
print(solve(nums, limit))

入力

[1,4,2,3], 4

出力

1

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

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列の合計を計算するために必要な配列が与えられます。 合計を取得するために各インデックスで配列と要素全体をトラバースするブルートフォースアプローチについては、以下で説明します。合計を取得するための各インデックスについては、以下で説明します。 例 # sum function def sum_(arr,n):    # using built-in function    return(sum(arr)) # main arr = [11,22,33,44,55,66

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

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