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
Solutions
Solution 1: Monotonic Stack
We can enumerate the height $h$ of each bar as the height of the rectangle. Using a monotonic stack, we find the index $left_i$, $right_i$ of the first bar with a height less than $h$ to the left and right. The area of the rectangle at this time is $h \times (right_i-left_i-1)$. We can find the maximum value.
The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ represents the length of $heights$.
Common model of monotonic stack: Find the nearest number to the left/right of each number that is larger/smaller than it. Template:
implSolution{#[allow(dead_code)]pubfnlargest_rectangle_area(heights:Vec<i32>)->i32{letn=heights.len();letmutleft=vec![-1;n];letmutright=vec![-1;n];letmutstack:Vec<(usize,i32)>=Vec::new();letmutret=-1;// Build left vectorfor(i,h)inheights.iter().enumerate(){while!stack.is_empty()&&stack.last().unwrap().1>=*h{stack.pop();}ifstack.is_empty(){left[i]=-1;}else{left[i]=stack.last().unwrap().0asi32;}stack.push((i,*h));}stack.clear();// Build right vectorfor(i,h)inheights.iter().enumerate().rev(){while!stack.is_empty()&&stack.last().unwrap().1>=*h{stack.pop();}ifstack.is_empty(){right[i]=nasi32;}else{right[i]=stack.last().unwrap().0asi32;}stack.push((i,*h));}// Calculate the max areafor(i,h)inheights.iter().enumerate(){ret=std::cmp::max(ret,(right[i]-left[i]-1)**h);}ret}}