1. 程式人生 > 其它 >Android 獲取Assets中的Json檔案轉換為實體類

Android 獲取Assets中的Json檔案轉換為實體類

84. 柱狀圖中最大的矩形

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

示例 1:

輸入:heights = [2,1,5,6,2,3]
輸出:10
解釋:最大的矩形為圖中紅色區域,面積為 10

示例 2:

輸入: heights = [2,4]
輸出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104
class Solution {
public:
   int largestRectangleArea(vector<int>& heights)
    {  
        //每個點的最大矩形是在那個點能延伸的矩形的最大值
        //就是我們需要找出每個柱子左右的第一個小於它的柱子就能計算這個柱子能延伸的矩形的最大值
        //如果暴力那麼會超時,因此我們使用單調棧,讓棧保持單調增,由於需要下標計算寬度,所以棧記憶體放下標
        //但是棧是按照柱子長度單調增。
        int ans = 0;
        vector<int> st;
        //左右放入高度為0的柱子最後就不必去計算棧不為空的情況
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        for (int i = 0; i < heights.size(); i++)
        {
            while (!st.empty() && heights[st.back()] > heights[i])//遇到棧頂的右邊界,那麼就出棧,同時計算棧頂的延伸矩陣最大值
            {
                int cur = st.back();//要計算的棧頂元素出棧
                st.pop_back();
                int left = st.back() + 1;//cur的左邊界下標
                int right = i - 1;//cur的右邊界下標
                ans = max(ans, (right - left + 1) * heights[cur]);//更新最大值
            }
            st.push_back(i);//保證每個節點入棧計算過
        }
        return ans;
    }
};