LeetCode661-图片平滑器

2022-03-25 做题

传送门 二维前缀和,定义f[i][j]为从矩阵左上角(0,0)到当前位置(i-1,j-1)的元素之和,那么任意一个3x3小矩阵内的9个元素之和就是tot=f[i+2][j+2] - f[i+2][j-1] - f[i-1][j+2] + f[i-1][j-1] 提一下这个状态转移方程需要注意的几个点:因为多减了一次f[i-1][j-1],所以要加回来;f[i][j]做了下标偏移是因为需要用到f[i+2][j-1]和f[i-1][j+2]来计算区域和。 class Solution { public: vector<vector<int>> imageSmoother(vector<vector<int>>& img) { int m = img.size(); int n = img[0].size(); vector<vector<int>> f(m+1, vector<int>(n+1)); vector<vector<int>> ans(m, vector<int>(n)); // 二维前缀和 // f[i][j]表示从(0,0)到(i-1,j-1)的区域内元素之和 // 比起传统的二维前缀和,做了下标偏移 // 因为后面计算时需要用到f[lx][ry+1]和f[rx+1][ly]计算区域和 for (int i = 1; i <= m; …

阅读全文 →

LeetCode每日一题:矩形区域不超过 K 的最大数值和

2021-04-25 做题

传送门 思路 记录这道题主要是为了记录二位前缀和的做题思路,毕竟CSP都遇见现题了,当时还只过了8个点... 其实前缀和也是一种形式的dp,这里借用LeetCode-304官方题解的图片,它画得很清晰了 [图片缺失] 原图:https://www.edisoncgh.com/wp-content/uploads/2021/04/1614650837-SAIiWg-1-1024x576.png 我们设dp[i][j]表示从矩阵左上角(0,0)到当前位置(i,j)的所有值之和,则不难得出图中的转移方程。减去dp[i-1][j-1]的原因是它在计算dp[i][j-1]+dp[i-1][j]中被计算了两次,要减掉多余的那一次。 这种思路在LeetCode周赛#225的T3中也有体现。 当我们对所有的(i,j)都算出前缀和后,用四重循环去依次枚举每一对左上角与右下角就行了。虽然纸面复杂度有O(n²* m²),但每一个右下角一定在左下角后面,所以对右下角的枚举并没有严格的平方级复杂度,所以还是能把题混过去的。 代码 ```cpp int sum[110][110]; class Solution { public: int maxSumSubmatrix(vector>& mat, int k) { int m = mat.size(), n = mat[0].size(); for(int i = 1; i <= m; …

阅读全文 →