地址:
力扣https://leetcode-cn.com/problems/matrix-block-sum/
题目:
给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:
i - k <= r <= i + k,
j - k <= c <= j + k 且
(r, c) 在矩阵内。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1 输出:[[12,21,16],[27,45,33],[24,39,28]] |
示例 2:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2 输出:[[45,45,45],[45,45,45],[45,45,45]] |
提示:
m == mat.length n == mat[i].length 1 <= m, n, k <= 100 1 <= mat[i][j] <= 100 |
思路:
题目也需要理解一下,最后其实划定的取值范围
r= [i-k, i+k] , j=[j-k, j+k]
当然 i-k , i+k , j-k, j+k 也要判断边界,找到符合边界内的这些值相加即可
方法一、遍历,注意边界条件
int **myMalloc(int r, int c, int *return_r, int **return_c)
{
int **ret = (int **)malloc(sizeof(int *) * r);
*return_r = r;
*return_c =(int *)malloc(sizeof(int) * r);
for(int i=0; i<r; i++)
{
ret[i] = (int *)malloc(sizeof(int) * c);
(*return_c)[i] = c;
}
return ret;
}
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** matrixBlockSum(int** mat, int matSize, int* matColSize, int k, int* returnSize, int** returnColumnSizes){
int r = matSize;
int c = matColSize[0];
int i,j, mat_r, mat_n;
int mat_i_start, mat_i_end, mat_j_start, mat_j_end;
int total = 0;
int **ret = myMalloc(r,c, returnSize, returnColumnSizes);
// find mat[r][c] r= [i-k, i+k] , j=[j-k, j+k]
for(i=0; i<r; i++)
{
if(i-k <= 0)
mat_i_start = 0;
else
mat_i_start = i-k;
if(i+k >= r)
mat_i_end = r;
else
mat_i_end = i+k+1;
for(j=0; j<c; j++)
{
total = 0;
if(j-k <= 0)
mat_j_start = 0;
else
mat_j_start = j-k;
if(j+k >= c)
mat_j_end = c;
else
mat_j_end = j+k+1;
// printf("[i-k]=[%d], [i+k]=[%d], mat_i_start=[%d], mat_i_end=[%d]\n", i-k, i+k, mat_i_start, mat_i_end);
// printf("[j-k]=[%d], [j+k]=[%d], mat_j_start=[%d], mat_j_end=[%d]\n", j-k, j+k, mat_j_start, mat_j_end);
for(mat_r=mat_i_start; mat_r < mat_i_end; mat_r++)
{
for(mat_n=mat_j_start; mat_n <mat_j_end; mat_n++)
{
// printf("total...+..mat[%d][%d]=[%d], total=[%d]\n",
// mat_r, mat_n, mat[mat_r][mat_n], total);
total += mat[mat_r][mat_n];
}
}
ret[i][j] = total;
}
}
return ret;
}
查看更多刷题笔记