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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形

發(fā)布時(shí)間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形 小編覺得挺不錯(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

暴力枚舉 - 左右端點(diǎn)法(TLE)

思路

我們暴力嘗試所有可能的矩形。由于矩陣是二維圖形, 我我們可以使用左右兩個(gè)端點(diǎn)來(lái)唯一確認(rèn)一個(gè)矩陣。因此我們使用雙層循環(huán)枚舉所有的可能性即可。而矩形的面積等于(右端點(diǎn)坐標(biāo) - 左端點(diǎn)坐標(biāo) + 1) * 最小的高度,最小的高度我們可以在遍歷的時(shí)候順便求出。

代碼

class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n, ans = len(heights), 0
if n != 0:
ans = heights[0]
for i in range(n):
height = heights[i]
for j in range(i, n):
height = min(height, heights[j])
ans = max(ans, (j - i + 1) * height)
return ans

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

暴力枚舉 - 中心擴(kuò)展法(TLE)

思路

我們?nèi)匀槐┝L試所有可能的矩形。只不過我們這一次從中心向兩邊進(jìn)行擴(kuò)展。對(duì)于每一個(gè) i,我們計(jì)算出其左邊第一個(gè)高度小于它的索引 p,同樣地,計(jì)算出右邊第一個(gè)高度小于它的索引 q。那么以 i 為最低點(diǎn)能夠構(gòu)成的面積就是(q - p - 1) * heights[i]。這種算法毫無(wú)疑問也是正確的。我們證明一下,假設(shè) f(i) 表示求以 i 為最低點(diǎn)的情況下,所能形成的最大矩陣面積。那么原問題轉(zhuǎn)化為max(f(0), f(1), f(2), ..., f(n - 1))。

具體算法如下:

  • 我們使用 l 和 r 數(shù)組。l[i] 表示 左邊第一個(gè)高度小于它的索引,r[i] 表示 右邊第一個(gè)高度小于它的索引。
  • 我們從前往后求出 l,再?gòu)暮笸坝?jì)算出 r。
  • 再次遍歷求出所有的可能面積,并取出最大的。

代碼

class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n = len(heights)
l, r, ans = [-1] * n, [n] * n, 0
for i in range(1, n):
j = i - 1
while j >= 0 and heights[j] >= heights[i]:
j -= 1
l[i] = j
for i in range(n - 2, -1, -1):
j = i + 1
while j < n and heights[j] >= heights[i]:
j += 1
r[i] = j
for i in range(n):
ans = max(ans, heights[i] * (r[i] - l[i] - 1))
return ans

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

優(yōu)化中心擴(kuò)展法(Accepted)

思路

實(shí)際上我們內(nèi)層循環(huán)沒必要一步一步移動(dòng),我們可以直接將j -= 1 改成 j = l[j], j += 1 改成 j = r[j]。

代碼

class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n = len(heights)
l, r, ans = [-1] * n, [n] * n, 0

for i in range(1, n):
j = i - 1
while j >= 0 and heights[j] >= heights[i]:
j = l[j]
l[i] = j
for i in range(n - 2, -1, -1):
j = i + 1
while j < n and heights[j] >= heights[i]:
j = r[j]
r[i] = j
for i in range(n):
ans = max(ans, heights[i] * (r[i] - l[i] - 1))
return ans

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

單調(diào)棧(Accepted)

思路

實(shí)際上,讀完第二種方法的時(shí)候,你應(yīng)該注意到了。我們的核心是求左邊第一個(gè)比 i 小的和右邊第一個(gè)比 i 小的。如果你熟悉單調(diào)棧的話,那么應(yīng)該會(huì)想到這是非常適合使用單調(diào)棧來(lái)處理的場(chǎng)景。

為了簡(jiǎn)單起見,我在 heights 首尾添加了兩個(gè)哨兵元素,這樣可以減少邊界處理的額外代碼。

代碼

class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n, heights, st, ans = len(heights), [0] + heights + [0], [], 0
for i in range(n + 2):
while st and heights[st[-1]] > heights[i]:
ans = max(ans, heights[st.pop(-1)] * (i - st[-1] - 1))
st.append(i)
return ans

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

1、【算法提高班】《貪婪策略》系列 - 覆蓋篇

2、一個(gè)HTTP數(shù)據(jù)包的奇幻之旅

3、一個(gè)函數(shù)解決【LeetCode 買賣股票的最佳時(shí)機(jī)】系列所有題目!

4、原來(lái)狀態(tài)機(jī)也可以用來(lái)刷LeetCode?

5、【算法提高班】《我的日程安排表》系列

6、用好這幾個(gè)工具,能大幅提升你的 Git/GitHub 操作效率!

如果覺得文章不錯(cuò),幫忙點(diǎn)個(gè)在看唄

總結(jié)

以上是生活随笔為你收集整理的如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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