Untitled

 avatar
unknown
c_cpp
a year ago
1.4 kB
5
Indexable
class Solution {
public:
    vector<int> nextSmallestRight(vector<int>& heights) {
        int n = heights.size();
        vector<int> ans(n, -1);
        stack<int> st;
        for(int i=0 ; i<n ; i++) {
            while (!st.empty() and heights[st.top()] > heights[i]) {
                ans[st.top()] = i;
                st.pop();
            }
            st.push(i);
        }
        return ans;
    }

    vector<int> nextSmallestLeft(vector<int>& heights) {
        int n = heights.size();
        vector<int> ans(n, -1);
        stack<int> st;
        for(int i=n-1 ; i>=0 ; i--) {
            while (!st.empty() and heights[st.top()] > heights[i]) {
                ans[st.top()] = i;
                st.pop();
            }
            st.push(i);
        }
        return ans;
    }

    int largestRectangleArea(vector<int>& heights) {
        vector<int> nxtSmallerEleRight = nextSmallestRight(heights);
        vector<int> nxtSmallerEleLeft = nextSmallestLeft(heights);
        int ans = -1;
        for(int i=0 ; i<heights.size() ; i++) {
            int fromRight = nxtSmallerEleRight[i] != -1 ?  heights[i]*(nxtSmallerEleRight[i] - i) : 0;
            int fromLeft = nxtSmallerEleLeft[i] != -1 ?  heights[i]*(i - nxtSmallerEleLeft[i]) : 0;
            int currAns = fromRight + fromLeft - heights[i];
            ans = max(ans, currAns);
        }
        return ans;
    }
};
Editor is loading...
Leave a Comment