解題目標:
在一個只包含「0」、「1」、「2」的二維矩陣中,找到只由「1」和「2」組成、且不包含「0」的最大矩形。接著,計算這個矩形的面積以及矩形內數字的總和。
解題步驟:
將矩陣轉換成直方圖:
- 我們從矩陣的每一行開始,計算每一列中「1」和「2」的連續高度(代表連續出現「1」或「2」的次數)。
- 如果遇到「0」,那一列的高度就變為 0,因為「0」不能包含在矩形中。
逐行計算最大矩形:
- 對於每一行(直方圖),我們嘗試找到基於當前行形成的最大矩形面積。
- 我們使用一個「堆疊」的資料結構來幫助計算每一行的最大矩形,這樣可以更快速地找到矩形的面積。
計算矩形內的數值總和:
- 當找到一個有效的最大矩形時,我們會計算這個矩形內所有「1」和「2」的數值總和。
更新結果:
- 不斷更新我們發現的最大矩形面積和總和,直到我們檢查完所有行的高度。
簡化示例:
假設有一個矩陣如下:
[
[0, 2, 0, 1, 2],
[0, 1, 1, 0, 0],
[2, 0, 2, 1, 1],
[0, 0, 1, 2, 0],
]
步驟:
- 第一行:找到每列的高度為
[0, 1, 0, 1, 1]
。 - 第二行:計算後得到高度為
[0, 2, 2, 0, 0]
,其中最大矩形面積是 4。 - 總和:找到這個矩形後,計算它內部的數字總和,得到總和為 6。
最終結果:
- 最大矩形面積:4
- 矩形內的數字總和:6
這樣的方式,可以有效地找到包含「1」和「2」的最大矩形,並計算相關數據。這是運用高度累加和最大矩形面積演算法解決問題的簡單思路。
計算直方圖中的最大矩形面積
def largest_histogram_area(heights):
stack = []
max_area = 0
index = 0
while index < len(heights):
if not stack or heights[index] >= heights[stack[-1]]:
stack.append(index)
index += 1
else:
top_of_stack = stack.pop()
area = (heights[top_of_stack] *
((index - stack[-1] - 1) if stack else index))
max_area = max(max_area, area)
while stack:
top_of_stack = stack.pop()
area = (heights[top_of_stack] *
((index - stack[-1] - 1) if stack else index))
max_area = max(max_area, area)
return max_area
計算最大矩形面積及其包含值的總和
def find_max_rectangle_with_sum(grid):
if not grid:
return 0, 0
rows = len(grid)
cols = len(grid[0])
heights = [0] * cols
max_area = 0
max_sum = 0
for row in range(rows):
for col in range(cols):
if grid[row][col] in (1, 2):
heights[col] += 1
else:
heights[col] = 0
# 使用堆疊來計算最大矩形面積及其對應的總和
stack = []
index = 0
while index < len(heights):
if not stack or heights[index] >= heights[stack[-1]]:
stack.append(index)
index += 1
else:
top_of_stack = stack.pop()
width = (index - stack[-1] - 1) if stack else index
area = heights[top_of_stack] * width
if area > max_area:
max_area = area
# 計算矩形內的值總和
total_sum = 0
for i in range(row - heights[top_of_stack] + 1, row + 1):
for j in range(stack[-1] + 1 if stack else 0, index):
total_sum += grid[i][j]
max_sum = total_sum
return max_area, max_sum
測試資料
grid = [
[0, 2, 0, 1, 2],
[0, 1, 1, 0, 0],
[2, 0, 2, 1, 1],
[0, 0, 1, 2, 0],
]
呼叫函式,計算最大矩形的面積及其值總和
max_area, max_sum = find_max_rectangle_with_sum(grid)
沒有留言:
張貼留言