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

Pythonで最大サブアレイ最小積を見つけるプログラム


配列numsがあるとすると、numsの空でない各サブ配列の最大最小積を見つける必要があります。答えは十分に大きい可能性があるため、10 ^ 9+7を法として返します。配列の最小積は、配列の最小値に配列の合計を掛けたものに等しくなります。したがって、[4,3,6](最小値は3)のような配列がある場合、最小積は3 *(4 + 3 + 6)=3 * 13=39になります。

したがって、入力がnums =[2,3,4,3]のような場合、結果を最大化するためのサブ配列[3,4,3]を取得できるため、出力は30になります。したがって、3 *(3 + 4 + 3)=3 * 10=30。

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

  • m:=10 ^ 9 + 7

  • スタック:=新しいスタック

  • rsum:=0、res:=0

  • numsの最後に0を挿入します

  • インデックスiと値v(nums)ごとに、実行します

    • スタックが空ではなく、nums[スタックの最上位のインデックス]>=vの場合、実行

      • index、val):=スタックの一番上にあり、スタックからポップします

      • arrSum:=rsum

      • スタックが空でない場合は、

        • arrSum:=rsum-スタックの最上位の値

      • res:=resと(nums [index] * arrSum)の最大値

    • rsum:=rsum + v

    • スタックの最後で(i、rsum)をプッシュします

  • resmodmを返す

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

def solve(nums):
   m = int(1e9+7)
   stack = []
   rsum = 0
   res = 0

   nums.append(0)

   for i, v in enumerate(nums):
      while stack and nums[stack[-1][0]] >= v:
         index, _ = stack.pop()

         arrSum=rsum

         if stack:
            arrSum=rsum-stack[-1][1]

         res=max(res, nums[index]*arrSum)

      rsum += v
      stack.append((i, rsum))

   return res % m

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

入力

[2,3,4,3]

出力

30

  1. Pythonで最大の建物の高さを見つけるプログラム

    値nと、制限と呼ばれるペアの別のリストがあるとします。都市にn棟の新しい建物を建てたいと思っています。ただし、制限はほとんどありません。私たちは一列に建てることができ、建物には1からnまでのラベルが付けられています。制限には2つのパラメーターがあるため、restrictions [i] =(id_i、max_height_i)は、id_iの高さがmax_height_i以下でなければならないことを示します。新しい建物の高さに関する市の制限は次のとおりです- 各建物の高さは0または正の値である必要があります。 最初の建物の高さは0でなければなりません。 隣接する2つの建物の高さ

  2. Pythonで範囲内のノード数を見つけるプログラム

    BSTがあり、左と右の境界lとrもあるとすると、lとrの間に値が存在するルート内のすべてのノードの数を見つける必要があります。 したがって、入力が次のような場合 l =7、r =13の場合、8、10、12の3つのノードがあるため、出力は3になります。 これを解決するために、次の手順に従います- スタック:=スタックと最初にルートを挿入し、カウント:=0 スタックが空でないときに、実行します node:=スタックの最上位要素、およびポップ要素 ノードがnullでない場合、 l<=ノードのデータ<=rの場合、 count:=count + 1