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

Pythonで雨水をトラップする


n個の非負の整数の配列があるとします。これらは、各バーの幅が1である標高マップを表しており、雨が降った後にトラップできる水量を計算する必要があります。したがって、マップは次のようになります-

Pythonで雨水をトラップする

ここでは、6つの青いボックスがあることがわかります。したがって、出力は6になります。

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

  • スタックst、water:=0およびi:=0

    を定義します
  • 私は<身長のサイズ

    • スタックが空またはheight[stacktop]> =height [i]の場合、iをスタックにプッシュし、iを1増やします

    • それ以外の場合

      • x:=スタックトップ要素、スタックからトップを削除

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

        • temp:=高さの最小値[スタックトップ要素]と高さ[i]

        • dest:=i –ス​​タックトップ要素– 1

        • 水:=水+距離*(temp – height [x])

  • 戻り水

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

class Solution(object):
   def trap(self, height):
      stack = []
      water = 0
      i=0
      while i<len(height):
         if len(stack) == 0 or height[stack[-1]]>=height[i]:
            stack.append(i)
            i+=1
         else:
            x = stack[-1]
            stack.pop()
            if len(stack) != 0:
               temp = min(height[stack[-1]],height[i])
               dist = i - stack[-1]-1
               water += dist*(temp - height[x])
      return water
ob = Solution()
print(ob.trap([0,1,0,2,1,0,1,3,2,1,2,1]))

入力

[0,1,0,2,1,0,1,3,2,1,2,1]

出力

6

  1. Pythonで最も水が多いコンテナ

    n個の非負の整数a1、a2、...、anのセットがあり、各値は座標(i、a [i])の点を表しているとします。 n本の垂直線は、線iの2つの端点が(i、a [i])と(i、a [0])にあるように存在します。 x軸と一緒に1つのコンテナを形成する2つの線を見つける必要があるため、水量が最大になる2つの列を見つけることが目標です。したがって、配列が[1,8,6,2,5,4,8,3,7]の場合、次のようになります 影付きの部分では、高さが7で、セクションが7つあるため、合計面積は実際には7 * 7=49です。これが出力です。 これを解決するために、次の手順に従います 低:=0、高:=a

  2. Pythonでのスタックおよびキューとしてのリストの使用

    この記事では、Python3.xのスタックとキューの構造について学習します。またはそれ以前。ここでは、これらのデータ構造内での動作と変更について説明します- これには-が含まれます 挿入操作(プッシュ、エンキュー) 削除操作(ポップ、デキュー) 表示/トラバース操作 前提条件 :リストとリスト操作 関連データ構造 :リスト操作 関連画像 スタック スタックでは、オブジェクトは互いに重ねて格納され、これらのオブジェクトは到着の逆の順序で削除されます。つまり、LIFOの概念に従います。 LIFOは、スタックデータ構造で後入れ先出しタイプの配置に従うことを意味します。 スタックで