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

LeetCode 1975: Maximum Matrix Sum

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

基本資料
#

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

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

解題思路
#

對相鄰兩格同時乘 -1:

  • 如果一格是負的、旁邊是正的,做完負號就「移到」旁邊。沿著路徑一直做,負號可以搬到任何格子。
  • 兩個負號碰在一起時一次消掉兩個。
  • 每次操作改變兩格的正負,所以負數個數的奇偶不變(把 0 當成可以吸收負號的格子)。

所以:負數個數是偶數,全部都能變正,答案是絕對值總和;是奇數,最後一定剩一個負的,把它放在絕對值最小的格子,答案是 總和 - 2 × 最小絕對值。有 0 的話最小絕對值就是 0,自動處理。

我的解法
#

class Solution:
    def maxMatrixSum(self, matrix: List[List[int]]) -> int:
        total, smallest, neg = 0, inf, 0
        for row in matrix:
            for x in row:
                total += abs(x)
                smallest = min(smallest, abs(x))
                neg += x < 0
        return total if neg % 2 == 0 else total - 2 * smallest

我當時另外記了一個 zero 旗標;有 0 的時候 smallest 就是 0,減掉也不影響,所以不需要。

複雜度
#

時間 O(n²),空間 O(1)。

要特別避免的錯誤
#

  • 留下的負號要放在絕對值最小的格子,不是值最小的。

面試口說整理
#

操作可以把負號沿著路徑搬到任何位置,兩個相遇就抵銷,但負數個數的奇偶不變。所以偶數個時答案是絕對值總和,奇數個時要扣掉兩倍的最小絕對值。時間 O(n²)。

相關文章

LeetCode 3796: Find Maximum Value in a Constrained Sequence
·1 分鐘
LeetCode Medium Greedy Array
LeetCode 3796 解題筆記:每個位置的上界是自己的限制、左邊上界 + 差值、右邊上界 + 差值三者取最小;左右各掃一次
LeetCode 3689: Maximum Total Subarray Value I
·1 分鐘
LeetCode Medium Greedy Array
LeetCode 3689 解題筆記:同一個子陣列可以重複選,整個陣列的最大減最小就是單一子陣列的最大值,選 k 次
LeetCode 2294: Partition Array Such That Maximum Difference Is K
·1 分鐘
LeetCode Medium Greedy Sorting Array
LeetCode 2294 解題筆記:子序列不在乎順序,排序後從最小的開始,每組盡量往右延伸到超過 min + k 為止
LeetCode 3195: Find the Minimum Area to Cover All Ones I
·1 分鐘
LeetCode Medium Array Matrix
LeetCode 3195 解題筆記:記錄 1 出現的最上、最下、最左、最右位置,矩形面積就是高乘寬
LeetCode 1222: Queens That Can Attack the King
·1 分鐘
LeetCode Medium Array Matrix Simulation
LeetCode 1222 解題筆記:從國王往八個方向一步一步走,每個方向第一個遇到的皇后就能攻擊;皇后放進集合方便查詢
LeetCode 2410: Maximum Matching of Players With Trainers
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 2410 解題筆記:兩邊都排序後,用同向雙指針讓最弱的球員配最小的、夠用的教練