↓快轉到主要內容
  1. LeetCode/

LeetCode 1727: Largest Submatrix With Rearrangements

·1 分鐘· ·
LeetCode Medium Greedy Sorting Matrix
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-06-23

  • 提交紀錄:Accepted(一次通過)

解題思路
#

固定子矩陣的底邊在第 i 列。每一欄往上連續的 1 有 h[j] 個(跟「直方圖最大矩形」一樣的高度)。

欄可以任意重排,所以把高的欄排在一起:高度由大到小排序後,取前 j + 1 欄,高度受限於第 j + 1 高的那欄,面積是 sorted_h[j] × (j + 1)。每一列、每個 j 取最大。

重排之後不用再管欄的位置,所以不需要單調堆疊,排序就好(Greedy 模板一)。

我的解法
#

class Solution:
    def largestSubmatrix(self, matrix: List[List[int]]) -> int:
        n = len(matrix[0])
        h = [0] * n
        best = 0
        for row in matrix:
            for j in range(n):
                h[j] = h[j] + 1 if row[j] else 0
            for j, height in enumerate(sorted(h, reverse=True)):
                best = max(best, height * (j + 1))
        return best

我當時直接把高度累加在 matrix 裡,這裡改用一個 h 陣列,不修改輸入。

複雜度
#

時間 O(m · n log n),空間 O(n)。

要特別避免的錯誤
#

  • 遇到 0 時高度要歸零,不是保留。
  • 排序的是複製出來的高度,不能打亂 h 本身(下一列還要用原本每欄的高度)。

面試口說整理
#

我固定子矩陣的底邊,算出每一欄往上有幾個連續的 1。欄可以重排,所以把高度由大到小排,取前 j + 1 欄時高度是第 j + 1 高的值,面積是它乘上 j + 1。每一列都算一次取最大。時間 O(m · n log n)。

相關文章

LeetCode 3961: Maximize Sum of Device Ratings
·1 分鐘
LeetCode Medium Greedy Sorting Matrix
LeetCode 3961 解題筆記:除了一台以外,每台把最小的單位捐給同一台;那台的評分變成全域最小值,挑第二小值最小的那台當接收者
LeetCode 1833: Maximum Ice Cream Bars
·1 分鐘
LeetCode Medium Greedy Sorting Counting-Sort
LeetCode 1833 解題筆記:從最便宜的開始買;題目要求計數排序,值域只有 10^5,每個價格一次買 min(數量, 錢 // 價格) 個
LeetCode 3555: Smallest Subarray to Sort in Every Sliding Window
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 3555 解題筆記:每個長度 k 的視窗都是一次 LeetCode 581;n 只有 1000,對每個視窗跑 O(k) 的兩次掃描即可
LeetCode 581: Shortest Unsorted Continuous Subarray
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 581 解題筆記:從左往右記最大值,最後一個比最大值小的位置是右界;從右往左記最小值,最後一個比最小值大的位置是左界
LeetCode 1877: Minimize Maximum Pair Sum in Array
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 1877 解題筆記:排序後最小配最大、次小配次大,對撞指針取配對和的最大值
LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊