語音計算矩形面積 兩道最大矩形的單調棧解法

2021-10-14 21:41:48 字數 3602 閱讀 7264

leetcode 84. 柱狀圖中最大的矩形

題目描述:給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

以上是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。

圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 `10` 個單位。

示例:輸入: [2,1,5,6,2,3]

輸出: 10

解法思路:

我們先來分析一下怎麼才能確定最後的結果,對於所能勾勒出的最大矩形的面積,它取決於當前柱子所能構成的矩形面積極大值,那麼也就是說,我們可以通過確定當前柱子之前所有柱子構成的面積,進而求得最大面積,那怎樣才能確定當面柱子之前的柱子構成的極大面積呢?我們以上面的輸入為例子來看圖

我們以第乙個柱子開始,對於他來說,他的前面沒有其他柱子,因此可以暫時將他跳過,我們來分析第二個柱子

對於第二個柱子,他的高度為1,那麼此時,我們可以確定,這個柱子之前所能構成的最大面積,也就是第乙個柱子的面積,由於第二個柱子比第乙個柱子矮,所以他限制了第乙個柱子所能構成的最大面積,也就是說,對於後面的柱子,他們能與這兩根柱子構成的最大面積取決於這倆柱子中更低的乙個,也就是高度為1的這個柱子,因此我們暫且不考慮第一根柱子的影響,我們繼續分析後面乙個柱子

對於高度為5的這根柱子,它可以確定可以由前面兩根柱子(注意這裡不是只由前面兩根柱子構成的面積)所構成的最大面積嘛?答案是不可以的,因為後面可能會有100個高度為5的柱子,所以對於可以構成高度公升序的柱子,我們都需要進行後面其他柱子的分析,

所以對於後面這個高度為6的柱子,我們仍需要繼續分析後面的柱子

我們繼續分析下面這張圖,對於當前高度為2的個柱子(右邊那個,不是左邊打橫線的那個),對於他的出現,他是可以確定只由前面高度為1,5,6這三根柱子所構成的最大面積,由於1,5,6呈公升序排列,那麼我們計算的時候可以從6開始,因為前一根柱子會限制由6構成的面積,所以我們就可以得出來由當前柱子開頭,公升序排列中最高柱子為尾的矩形面積就等於 當前柱子高度*矩形的跨度

其實分析到這裡,我們就可以找到乙個規律,也就是對於輸入的序列,當第i+1根柱子比第i根柱子更矮的時候,我們就可以確定由第i根柱子及其之前所能構成的矩形面積(因為第i+1根柱子更矮,會阻礙前一根更高柱子的面積擴充套件)。

分析到這裡,我們的最終**的思路也就清晰了,由於需要考慮**後面乙個更大(或者更小)元素**,因此我們選擇單調棧進行解題,我們這裡需要考慮的是下乙個更小元素。

class solution                 //計算當前矩形的寬度                int width;                if(stk.isempty())else                //獲取當前面積                int temp = heights[top]*width;                if(temp> max)                    max = temp;            }            stk.push(i);        }        //棧沒有空的情況,也就是經過上面的for迴圈,棧中還有元素        //也就是最後形成了乙個公升序序列,再來一次上面的邏輯就可以了        //比如(2,1,5,6,2,4,3),最後棧內下標表示的元素高度為(1,2,3)        while(!stk.isempty())            int width;            if(stk.isempty())else            int temp = heights[top]*width;            if(temp> max)            max = temp;        }                return max;    }}
時間複雜度:o(n),每個元素都需要一次入棧一次出棧

空間複雜度o(n),用於存放陣列

leetcode 85. 最大矩形

題目描述:給定乙個僅包含 `0` 和 `1` 、大小為 `rows x cols` 的二維二進位制矩陣,找出只包含 `1` 的最大矩形,並返回其面積。

示例:

輸入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]

輸出:6

解釋:最大矩形如上圖所示。

解法思路:有了上面一題的鋪墊,順便想想這道題怎麼做,可能有的同學會想到動態規劃的思路,筆者之前也是這麼想的,因為之前做過一道類似的題是求矩陣中正方形面積,但是筆者最後無法用動態規劃的思路接出來,但是有了上面哪一題的思路,我們想一下能不能用單調棧的思路來做。

對於矩陣中的第一行(1,0,1,0,0),我們可以很容易的套用上一題的解法來做,那麼我們來想一下一下第二行(1,0,1,1,1),對於這一行,它可以和第一行一起構成乙個(2,0,2,1,1)的乙個陣列,我們仍然可以套用上一題的解法來做,,還可以繼續要用到第三行,形成乙個(3,1,3,2,2)的陣列,來求當前前三行構成矩陣的最大面積。那麼對於第四行,我們發現他有很多0,對於0來說,他是不可以延續前面幾行形成的矩陣面積,因此遇到0,我們就把對應的矩形高度置為0就可以了。

所以這道題的解法也就是分層構建柱狀圖,然後套用上一題的解法就可以了

class solution else                while( !stk.isempty() &&   temp[stk.peek()] > temp[j] )                                        if(stk.isempty())else                    max = math.max(  max , width* temp[top] );                }                stk.push(j);            }            while( !stk.isempty())                if(stk.isempty())else                max = math.max(  max , width*temp[top] );            }        }        return max;    }}
時間複雜度:o(mn),m,n分別是矩陣行數和列數

空間複雜度:o(n),矩陣列數

語音計算矩形面積 LeetCode85 最大矩形

今天在製作書籤的時候 突然想到了乙個問題 如果要送給未來的女朋友乙個書籤 上面該寫些什麼話 哈哈哈哈哈哈哈哈哈 the spring is coming 想了一會兒,覺得這句話最合適 to 天使的笑,燦爛的心!哎,還是先找個女朋友再說吧!給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1...

語音計算矩形面積 如何計算廣義球面矩形的面積

如圖,dc為赤道上的圓弧,ab為緯線上的圓弧,兩個平面 和 分別通過兩極切割球面,形成割線ad和bc,顯然,dc ad bc皆為大圓弧。我們稱四邊形abcd為廣義球面矩形。這個矩形的面積如何計算呢?用矩形在緯度線上的弧長與 的乘積,然後求和就可以得到矩形的面積,也就是 s cos d sin c 1...

1102 面積最大的矩形

有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。例如 2,1,5,6,2,3,對應的直方圖如下 面積最大的矩形為5,6組成的寬度為2的矩形,面積為10。收起第1行 1個數n,表示陣列的長度 0 n 50000 第2 n 1行 陣列元素a i 1 a i 10 9 輸出最大的矩形面積62...