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

PythonでXをゼロに減らすための最小操作を見つけるプログラム


numsという配列と別の値xがあるとします。 1つの操作で、配列から左端または右端の要素を削除し、xから値を減算することができます。 xを正確に0に減らすために必要な操作の最小数を見つける必要があります。それが不可能な場合は、-1を返します。

したがって、入力がnums =[4,2,9,1,4,2,3] x =9のような場合、最初は左端の要素4を削除する必要があるため、出力は3になります。したがって、配列は次のようになります。 [2,9,1,4,2,3]およびxは5になり、次に右端の要素3を削除するため、配列は[2,9,1,4,2]になり、x =2になり、さらに次のいずれかになります。左から左または右からx=0にし、配列は[2,9,1,4]または[9,1,4,2]のいずれかになります。

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

  • n:=numsのサイズ
  • leftMap:=新しいマップ
  • leftMap [0]:=-1
  • 左:=0
  • 0からn-1の範囲のiの場合、do
    • 左:=左+ nums [i]
    • leftがleftMapにない場合は、
      • leftMap [left]:=i
  • 右:=0
  • ans:=n + 1
  • nから0の範囲のiの場合、1ずつ減らします。
    • i
    • right:=right + nums [i]
  • 左:=x-右
  • leftMapにleftが存在する場合、
    • ans:=最小のansとleftMap [left] + 1 + n-i
  • ansがn+1と同じ場合、
    • 戻り値-1
  • 回答を返す
  • 理解を深めるために、次の実装を見てみましょう-

    def solve(nums, x):
       n = len(nums)
    
       leftMap = dict()
       leftMap[0] = -1
       left = 0
       for i in range(n):
          left += nums[i]
          if left not in leftMap:
             leftMap[left] = i
    
       right = 0
       ans = n + 1
       for i in range(n, -1, -1):
          if i < n:
             right += nums[i]
          left = x - right
          if left in leftMap:
             ans = min(ans, leftMap[left] + 1 + n - i)
       if ans == n + 1:
          return -1
       return ans
    
    nums = [4,2,9,1,4,2,3]
    x = 9
    print(solve(nums, x))

    入力

    [4,2,9,1,4,2,3], 9
    

    出力

    3

    1. PythonでNを1に減らす最大の操作を見つける

      2つの数PとQがあり、それらが数N =(P!/ Q!)を形成するとします。可能な最大数の操作を実行して、Nを1に減らす必要があります。各操作で、NがXで割り切れる場合、NをN/Xに置き換えることができます。可能な最大数の操作を返します。 したがって、入力がA =7、B =4の場合、Nは210、除数は2、3、5、7であるため、出力は4になります。 これを解決するには、次の手順に従います- N:=1000005 因数:=サイズNの配列で、0で埋める メインの方法から、次のようにします- 2からNの範囲のiの場合、実行します factor [i]が0と同じ場合、