生活随笔
收集整理的這篇文章主要介紹了
算法:柱状图中最大矩形
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?題目要求
給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度,并且每個柱子彼此相鄰,且寬度為 1 。求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。
- 以下是柱狀圖的示例,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。
- 圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個單位。如下:
輸入: [2,1,5,6,2,3]輸出: 10
//柱狀圖中最大矩形//枚舉寬,固定一邊枚舉另一邊,然后計算面積
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();int ans = 0;// 枚舉左邊界for (int left = 0; left < n; ++left) {int minHeight = INT_MAX;// 枚舉右邊界for (int right = left; right < n; ++right) {// 確定高度minHeight = min(minHeight, heights[right]);// 計算面積ans = max(ans, (right - left + 1) * minHeight);}}return ans;}
};//枚舉高
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();int ans = 0;for (int mid = 0; mid < n; ++mid) {// 枚舉高int height = heights[mid];int left = mid, right = mid;// 確定左邊界,取左邊界最高的那個while (left - 1 >= 0 && heights[left - 1] >= height) {--left;}// 確定右邊界,取右邊界最高的那個while (right + 1 < n && heights[right + 1] >= height) {++right;}// 計算面積ans = max(ans, (right - left + 1) * height);}return ans;}
};//單調棧
func largestRectangleArea(heights []int) int {n := len(heights)left, right := make([]int, n), make([]int, n)//棧mono_stack := []int{}//取左邊的第一個小于當前的for i := 0; i < n; i++ {//棧頂元素大于或等于當前元素就出棧for len(mono_stack) > 0 && heights[mono_stack[len(mono_stack)-1]] >= heights[i] {//出棧mono_stack = mono_stack[:len(mono_stack)-1]}if len(mono_stack) == 0 {left[i] = -1} else {left[i] = mono_stack[len(mono_stack)-1]}mono_stack = append(mono_stack, i)}//取右邊的第一個小于當前的mono_stack = []int{}for i := n - 1; i >= 0; i-- {//棧頂元素大于或等于當前元素就出棧for len(mono_stack) > 0 && heights[mono_stack[len(mono_stack)-1]] >= heights[i] {//出棧mono_stack = mono_stack[:len(mono_stack)-1]}if len(mono_stack) == 0 {right[i] = n} else {right[i] = mono_stack[len(mono_stack)-1]}mono_stack = append(mono_stack, i)}ans := 0for i := 0; i < n; i++ {ans = max(ans, (right[i] - left[i] - 1) * heights[i])}return ans
}func max(x, y int) int {if x > y {return x}return y
}
?
總結
以上是生活随笔為你收集整理的算法:柱状图中最大矩形的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。