Largest Rectangle in Histogram

Problem Link: Leetcode

Problem Statement

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: 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: example_2 Input: heights = [2,4]
Output: 4

Solution

Approach 1: Brute Force

The brute force approach is to consider every possible rectangle that can be formed from the given heights.

/*


*/
class Solution {
public:
    int largestRectangleAreaBruteForce(vector<int>& heights) {
        int maxArea = 0;
        int n = heights.size();
        for (int i = 0; i < n; i++) {
            int area = heights[i];
            int minHeight = heights[i];
            for (int j = i; j < n; j++) {
                minHeight = min(minHeight, heights[j]);
                area = (j - i + 1) * minHeight;
                maxArea = max(maxArea, area);
                if ((n - i) * minHeight < maxArea) {
                    break;
                }
            }
        }
        return maxArea;
    }

    int largestRectangleArea(vector<int>& heights) {
        return largestRectangleAreaBruteForce(heights);
    }
};

Approach 2: Using Two Monotonous Stacks

class Solution {
public:
    vector<int> nextSmallerElement(vector<int>& h) {
        int n = h.size();
        vector<int> smallerElementPos(n, n);

        stack<int> s;
        for (int i = n-1; i >= 0; i--) {
            // not interested in bigger numbers
            while (s.size() && h[s.top()] >= h[i]) {
                s.pop();
            }
            if (s.size()) {
                smallerElementPos[i] = s.top();
            }
            s.push(i);
        }

        return smallerElementPos;
    }

    vector<int> previousSmallerElement(vector<int>& h) {
        int n = h.size();
        vector<int> smallerElementPos(n, -1);

        stack<int> s;
        for (int i = 0; i < n; i++) {
            while (s.size() && h[s.top()] >= h[i]) {
                s.pop();
            }
            if (s.size()) {
                smallerElementPos[i] = s.top();
            }
            s.push(i);
        }
        return smallerElementPos;
    }

    int largestRectangleArea(vector<int>& heights) {
        return largestRectangleAreaUsingTwoStacks(heights);
    }

    int largestRectangleAreaUsingTwoStacks(vector<int>& heights) {
        
        auto pre = previousSmallerElement(heights);
        auto post = nextSmallerElement(heights);
        int n = heights.size();

        int result = 0;

        for (int i = 0; i < n; i++) {
            int start = pre[i];
            int end = post[i];
            int width = end - 1 - start;
            int area = width * heights[i];
            result = max(result, area);
        }
        return result;

    }
};
Home | © 2024 Last Updated: Mar 03, 2024
Buy Me A Coffee