# Leetcode 1314. Matrix Block Sum ###### tags: `Leetcode(C++)` 題目 : https://leetcode.com/problems/matrix-block-sum/ 。 想法 : 狀態定義 : 這一格到左上角的總和。 area[i][j] = area[i-1][j] + area[i][j-1] - area[i-1][j-1]; 算出每一格的前綴和後,根據K來決定邊界。 mat[i][j] = mat[i][j] - mat[i-1][j] - mat[i][j-1] + mat[i-1][j-1] 即為我們的答案。 時間複雜度 : O(n*m)。 程式碼 : ``` class Solution { public: vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) { int r=mat.size(), c=mat[0].size(); for(int i=0 ; i<r ; i++){ for(int j=0 ; j<c ; j++){ if(i > 0) mat[i][j]+=mat[i-1][j]; if(j > 0) mat[i][j]+=mat[i][j-1]; if(i > 0 && j > 0) mat[i][j]-=mat[i-1][j-1]; } } vector<vector<int>> ans(r, vector<int>(c)); for(int i=0 ; i<r ; i++){ for(int j=0 ; j<c ; j++){ int r0=max(0, i-k), c0=max(0, j-k), r1=min(r-1, i+k), c1=min(c-1, j+k); ans[i][j] = mat[r1][c1]; if(r0 > 0) ans[i][j]-=mat[r0-1][c1]; if(c0 > 0) ans[i][j]-=mat[r1][c0-1]; if(r0 > 0 && c0 > 0) ans[i][j]+=mat[r0-1][c0-1]; } } return ans; } }; ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up