雙周賽108。還挺妙的題,考慮太多反而會寫得太複雜。

題目

輸入兩個整數m和n,代表一個m*n的矩陣。

還有一個二維的矩陣座標,其中coordinates[i] = [x, y],代表矩陣的[x, y]格子是黑色的。沒在coordinates中出現的其餘格子都是白色

區塊指的是一個2*2的子矩陣。更正式地說,滿足0 <= x < m - 1且0 <= y < n - 1,並以[x, y]為左上角的區塊,包含了[x, y], [x + 1, y], [x, y + 1]和[x + 1, y + 1]四個格子。

回傳長度為5的陣列arr,其中arr[i]代表擁有i個黑色格子的區塊數量。

解法

一個區塊會包含4個格子,換句話說,一個格子可能會對4個區塊產生影響。
而有效的區塊位置不可以是最後一行或是最後一列。

維護雜湊表,記錄各區塊的黑色格子數量。
遍歷coordinates中的座標x,y,並窮舉四個可能的區塊位置,如果是合法的區塊,則將其黑色計數+1。

先求出所有的區塊數,扣掉有黑色的區塊數,剩下就是沒有黑色的區塊數量。

時間複雜度O(Q),其中Q為coordinates長度。
空間複雜度O(Q)。

class Solution:
    def countBlackBlocks(self, m: int, n: int, coordinates: List[List[int]]) -> List[int]:
        d=Counter()
        tot=(m-1)*(n-1)
        
        for x,y in coordinates:
            for dx in range(2):
                for dy in range(2):
                    xx=x-dx
                    yy=y-dy
                    if 0<=xx<m-1 and 0<=yy<n-1:
                        d[(xx,yy)]+=1

        ans=[0]*5
        for v in d.values():
            ans[v]+=1
            tot-=1
            
        ans[0]=tot
            
        return ans