Hard
Given an array of integers heights
representing the histogram’s bar height where the width of each bar is 1
, return the area of the largest rectangle in the histogram.
Example 1:
Input: heights = [2,1,5,6,2,3]
Output: 10
Explanation: The above is a histogram where width of each bar is 1. The largest rectangle is shown in the red area, which has an area = 10 units.
Example 2:
Input: heights = [2,4]
Output: 4
Constraints:
1 <= heights.length <= 105
0 <= heights[i] <= 104
# @param {Integer[]} heights
# @return {Integer}
def largest_rectangle_area(heights)
area = 0
stack = []
return 0 if heights.empty?
return heights[0] * heights.length if heights.uniq.length == 1
heights.each.with_index do |height, index|
start = index
while !stack.empty? && stack.last[1] > height do
i, h = stack.pop
area = [area, h * (index - i)].max
start = i
end
stack << [start, height]
end
stack.each do |i, s|
area = [area, s * (heights.length - i)].max
end
area
end