周賽313。

題目

輸入一個m*n的整數矩陣grid。
沙漏指的是矩陣中的某一部分,如下圖:
沙漏圖片

求所有沙漏的最大總和。
注意,沙漏不可旋轉,且必須完整出現在矩陣中。

解法

沙漏本身只佔了7個格子,也就是7次運算。而矩陣最大是150*150,暴力窮舉所有沙漏也只要150*150*7=157500次運算,還在合理範圍內。
順帶一提,如果沙漏的格子很長,可能就要考慮用2D前綴和來降低複雜度。

根據窮舉的方法不同,這題難度可能會有一些差異。窮舉沙漏中心點,xy軸和中心點距離最多1,只需要適時+1或-1;如果窮舉沙漏左上角,就會要多打很多加號,而且會出現+1、+2的情況。

時間複雜度O(M*N*),空間複雜度O(1)。

class Solution:
    def maxSum(self, grid: List[List[int]]) -> int:
        M,N=len(grid),len(grid[0])
        ans=0
        
        for r in range(1,M-1):
            for c in range(1,N-1):
                val=grid[r][c]
                val+=grid[r+1][c-1]+grid[r+1][c]+grid[r+1][c+1]
                val+=grid[r-1][c-1]+grid[r-1][c]+grid[r-1][c+1]
                ans=max(ans,val)
        
        return ans