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
(define/contract (largest-rectangle-area heights)
(-> (listof exact-integer?) exact-integer?)
(let* ((n (length heights))
(heights-vec (list->vector (append heights '(0))))
(stack '())
(max-area 0))
(for ([i (in-range (add1 n))])
(let loop ()
(when (and (not (null? stack))
(<= (vector-ref heights-vec i) (vector-ref heights-vec (car stack))))
(let* ((top (car stack))
(new-stack (cdr stack))
(height (vector-ref heights-vec top))
(width (if (null? new-stack) i (- i (car new-stack) 1)))
(area (* height width)))
(set! max-area (max max-area area))
(set! stack new-stack)
(loop))))
(set! stack (cons i stack)))
max-area))