From 7f1c1c8689c3bb501e94d2d1f863c344a1e74807 Mon Sep 17 00:00:00 2001 From: SURAJ KUMAR SAHU <118847989+sksahu01@users.noreply.github.com> Date: Tue, 7 Oct 2025 18:46:37 +0000 Subject: [PATCH] feat: implement LargestRectangleHistogram for calculating maximum rectangle area in a histogram --- .../com/thealgorithms/stacks/heights.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/com/thealgorithms/stacks/heights.java diff --git a/src/main/java/com/thealgorithms/stacks/heights.java b/src/main/java/com/thealgorithms/stacks/heights.java new file mode 100644 index 000000000000..27d53c9986ac --- /dev/null +++ b/src/main/java/com/thealgorithms/stacks/heights.java @@ -0,0 +1,34 @@ +import java.util.Stack; + +public class LargestRectangleHistogram { + public static int largestRectangleArea(int[] heights) { + Stack stack = new Stack<>(); + int maxArea = 0; + int n = heights.length; + + for (int i = 0; i <= n; i++) { + // Use 0 height at end to flush stack + int h = (i == n) ? 0 : heights[i]; + + while (!stack.isEmpty() && h < heights[stack.peek()]) { + int height = heights[stack.pop()]; + int width; + if (stack.isEmpty()) { + width = i; // rectangle extends from 0 to i-1 + } else { + width = i - stack.peek() - 1; // between previous smaller and i + } + maxArea = Math.max(maxArea, height * width); + } + stack.push(i); + } + + return maxArea; + } + + public static void main(String[] args) { + int[] heights = {2, 1, 5, 6, 2, 3}; + int result = largestRectangleArea(heights); + System.out.println("Largest Rectangle Area: " + result); + } +}