單調棧的應用

2021-10-04 21:11:35 字數 927 閱讀 1994

筆者在做leecode的題(求柱形的最大面積)時,接觸到了單調棧這一資料結構,經過研究發現,單調棧是乙個比較簡單的資料結構,但是要靈活運用卻十分不簡單。

單調遞增棧:資料出棧的序列為單調遞增序列

單調遞減棧:資料出棧的序列為單調遞減的序列

描述:有n個人站隊,所有的人全部向右看,個子高的可以看到個子低的髮型,給出每個人的身高,問所有人能看到其他人髮型的總和是多少。

例子:輸入:4 3 7 1   輸出:2

解釋:個子為4的可以看到個子為3的髮型,個子為7的可以看到個子為1的髮型。

思路:題目實際可以轉化為找當前數字向右查詢的第乙個大於它之間的數字有多少個數字,然後將結果累計即為結果。

1.設定乙個單調遞增的棧(出棧序列單調遞增)

2.當遇到大於棧頂的元素時,開始更新之前不高於當前人所能看到的值。

這種情況下得在原始序列push乙個int_max。使全部元素能夠出棧。

思路:當前的數字可以向兩邊擴充套件,遇到比自己大的就擴充套件,小的就停止。然後用自己的高度乘以擴充套件的寬度就是最大面積。

因為棧中序列是遞增的,所以往左不可擴充套件,當碰到比棧頂元素小的資料的時候就是擴充套件的右邊界。

讀者可以對照**來理解。

class solution 

else ans = max(ans, heights[t] * (i - s.top() - 1));

}s.push(i);

}return ans;

}};

描述:給出一組陣列,求一區間,使得區間元素和乘以區間最小值最大,結果要求給出這個最大值和區間的左右端點。

輸入:3 1 6 4 5 2

輸出:60

3    5

將[3,5] (6+4+5)這段區間相加,將和與區間內最小元素相乘獲得最大數字60。

思路:應使用單調遞減棧,建議參考部落格

單調棧的應用

問題描述 柱狀圖是有一些寬度相等的長方形下端對齊後橫向排列得到的圖形。現在有n個由寬度為1,高度分別為h1,h2,hn的長方形從左到右依次排列組成的柱狀圖。問裡面包含的長方形的最大面積是多少?分析 最容易想到的方法是 討論左端l和右端r。如果確定了長方形的左端l和右端r,那麼最大的可能高度就是min...

單調棧的應用

單調棧 故名思意,棧中元素是單調遞增 不減 或者是單調遞減 不增 leetcode 85 最大矩形 是乙個應用單調棧的好題目。題目分析 要找到乙個最大矩形,當然可以暴力解法,這個思路簡單,這裡就不多說了。該如何使用單調棧解決問題呢?可以先嘗試地做leetcode 84 柱狀圖中的最大矩形 這個是85...

單調棧的應用

單調棧的使用 單調棧的分類 單調遞增棧 單調遞減棧 所謂的遞增和遞減,相對的是 棧頂 棧底的資料大小表示 棧頂 棧底 從小到大 單調遞增 棧頂 棧底 從大到小,單調遞減 單調棧的實現方式 舉例用單調遞增棧 從後向前進行儲存,並讀取。如果棧空入棧 棧非空,此時棧頂元素 入棧元素,入棧 棧非空,此時棧頂...