周賽328。這題有點微妙,以前在Q2用了2D前綴和,後來才發現只需要暴力法,總覺得這次也要暴力。
結果看到測資範圍發現不對,但又想不到什麼太好的方法,無法確定會不會TLE。

題目

輸入正整數n,代表有一個n*n的空矩陣mat。

另外有個二維整數陣列qeury,對於每個query[i] = [row1i, col1i, row2i, col2i],你必須:

  • 以(row1i, col1i)為左上角,(row2i, col2i)為右下角,將範圍內的所有元素加一。

執行所有query後,回傳mat。

解法

可以把矩陣看成n個列,每次query[i]分別處理row1i~row2i,將(col1i, col2i)紀錄差分為1。

執行完查詢之後,再對每個列分別做一次前綴和,得到正確的數值。

class Solution:
    def rangeAddQueries(self, n: int, queries: List[List[int]]) -> List[List[int]]:
        mat=[[0]*(n) for _ in range(n)]
        
        for r1,c1,r2,c2 in queries:
            for r in range(r1,r2+1):
                mat[r][c1]+=1
                if c2+1<n:
                    mat[r][c2+1]-=1
                    
        for r in range(n):
            for c in range(1,n):
                mat[r][c]+=mat[r][c-1]
                
        return mat