前往
大廳
主題

LeetCode - 1727. Largest Submatrix With Rearrangements 解題心得

Not In My Back Yard | 2024-04-12 12:00:29 | 巴幣 0 | 人氣 29

題目連結:


題目意譯:
你被給定一個大小為 m × n 的二元矩陣 matrix,而你被允許按照任意順序來重新排列矩陣的每一的直行。

回傳在按最佳的方式重新排列每一個直行後,在矩陣中只由 1 所組成的子矩陣之最大面積為何。

限制:
m == matrix.length
n == matrix[i].length
1 ≦ m × n ≦ 10 ^ 5
matrix[i][j] 只會是 0 或 1。



範例測資:
範例 1:
輸入: matrix = [[0,0,1],[1,1,1],[1,0,1]]
輸出: 4
解釋: 你可以按上圖重新排列每一個直行。
只由 1 組成之最大子矩陣以粗框框起,其面積為 4。

範例 2:
輸入: matrix = [[1,0,1,0,1]]
輸出: 3
解釋: 你可以按上圖重新排列每一個直行。
只由 1 組成之最大子矩陣以粗框框起,其面積為 4。

範例 3:
輸入: matrix = [[1,1,0],[1,0,1]]
輸出: 2
解釋: 注意到你只能移動一整個直行,因此你無法使只由 1 組成的最大子矩陣之面積大過 2。


解題思維:
首先,先仿照這題來對每一列每一行之每一個格子「往上延伸」可以延伸的多長,也就是說對 matrix[i][j] 來說往 matrix[i - 1][j] 之方向走看可以走連續幾個 1 直到碰到 0 為止(從自己出發,如果自己是 0 則是 0 個連續的 1)。

然後我們一次取一整列的「往上延伸」之結果,並按照這題的作法來求出最大的、只由 1 組成的子矩陣。不過,現在我們可以排序這些直行。那要怎麼排列這些直行呢?可以看到,「往上延伸」較多的應該要聚在一起才能形成若干個較大的完整子矩形。

因此我們可以先按照「往上延伸」量來由小排到大或由大排到小再按上面的方式求最大子矩陣之面積。

而上面是單一一列的結果,因此我們只要把每一列的結果取最大值即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作