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

Pythonのヒストグラムで最大の長方形


ヒストグラムの高さを表す整数配列が1つあるとします。各バーには単位幅があります。次のように最大面積の長方形を見つける必要があります-

Pythonのヒストグラムで最大の長方形

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

  • スタックを作成し、i:=0、ans:=0

    を設定します
  • <高さのサイズなら

    • スタックの要素が0であるか、スタックの最上位要素の高さが<=height [i]の場合、

      • iをスタックに挿入し、iを1増やします

    • それ以外の場合-

      • x:=スタックの最上位要素、スタックから削除します。

      • height:=heights [x]

      • temp:=height *(i * stack [-1] – 1)スタックが空でない場合、それ以外の場合はtemp:=height * i

      • ans:=ansとtempの最大値

  • スタックが空でない間-

    • x:=スタックトップ要素

    • height:=height [x]、スタックから削除

    • temp:=高さ*高さの長さ–スタックトップ要素–スタックが空でない場合は1、それ以外の場合はtemp:=高さの長さ

    • ans:=ansとtempの最大値

  • ansを返す

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

class Solution(object):
   def largestRectangleArea(self, heights):
      stack = []
      i = 0
      ans = 0
      while i < len(heights):
         if len(stack) == 0 or heights[stack[-1]]<=heights[i]:
            stack.append(i)
            i+=1
         else:
            x = stack[-1]
            stack.pop()
            height = heights[x]
            temp = height * (i-stack[-1]-1) if len(stack)!= 0 else height * i
            ans = max(ans,temp)
      while len(stack)>0:
         x = stack[-1]
         height = heights[x]
         stack.pop()
         temp = height * (len(heights)-stack[-1]-1) if len(stack)!= 0 else height* len(heights)
         ans = max(ans,temp)
      return ans
ob = Solution()
print(ob.largestRectangleArea([2,1,5,7,3,2]))

入力

[2,1,5,7,3,2]

出力

12

  1. Pythonで最大の三角形の領域

    平面上の点のリストがあるとします。 3つの点で形成できる最大の三角形の領域を見つける必要があります。 したがって、入力が[[0,0]、[0,1]、[1,0]、[0,2]、[2,0]]の場合、出力は2になります。 これを解決するには、次の手順に従います- res:=0 N:=ポイントリストのサイズ 0からN-2の範囲のiの場合、do i +1からN-1の範囲のjの場合、do i + 2からNの範囲のkについては、 (x1、y1):=points [i]、 (x2、y2):=points [j]、 (x3、y3):=ポイント[k] res:=resの最大値、0.5 *

  2. Pythonで雨水をトラップする

    n個の非負の整数の配列があるとします。これらは、各バーの幅が1である標高マップを表しており、雨が降った後にトラップできる水量を計算する必要があります。したがって、マップは次のようになります- ここでは、6つの青いボックスがあることがわかります。したがって、出力は6になります。 これを解決するには、次の手順に従います- スタックst、water:=0およびi:=0を定義します 私は<身長のサイズ =height [i]の場合、iをスタックにプッシュし、iを1増やします それ以外の場合 x:=スタックトップ要素、スタックからトップを削除 スタックが空で