日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

算法:柱状图中最大矩形

發(fā)布時(shí)間:2025/6/15 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法:柱状图中最大矩形 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?題目要求

給定 n 個(gè)非負(fù)整數(shù),用來(lái)表示柱狀圖中各個(gè)柱子的高度,并且每個(gè)柱子彼此相鄰,且寬度為 1 。求在該柱狀圖中,能夠勾勒出來(lái)的矩形的最大面積。

  • 以下是柱狀圖的示例,其中每個(gè)柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]。
  • 圖中陰影部分為所能勾勒出的最大矩形面積,其面積為 10 個(gè)單位。如下:

  • 示例:
輸入: [2,1,5,6,2,3]輸出: 10 //柱狀圖中最大矩形//枚舉寬,固定一邊枚舉另一邊,然后計(jì)算面積 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]);// 計(jì)算面積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;// 確定左邊界,取左邊界最高的那個(gè)while (left - 1 >= 0 && heights[left - 1] >= height) {--left;}// 確定右邊界,取右邊界最高的那個(gè)while (right + 1 < n && heights[right + 1] >= height) {++right;}// 計(jì)算面積ans = max(ans, (right - left + 1) * height);}return ans;} };//單調(diào)棧 func largestRectangleArea(heights []int) int {n := len(heights)left, right := make([]int, n), make([]int, n)//棧mono_stack := []int{}//取左邊的第一個(gè)小于當(dāng)前的for i := 0; i < n; i++ {//棧頂元素大于或等于當(dāng)前元素就出棧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)}//取右邊的第一個(gè)小于當(dāng)前的mono_stack = []int{}for i := n - 1; i >= 0; i-- {//棧頂元素大于或等于當(dāng)前元素就出棧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 }

?

總結(jié)

以上是生活随笔為你收集整理的算法:柱状图中最大矩形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。