0
点赞
收藏
分享

微信扫一扫

1314. 矩阵区域和

westfallon 2022-01-10 阅读 19
leetcode

地址:

力扣icon-default.png?t=LBL2https://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;
}

  查看更多刷题笔记

举报

相关推荐

0 条评论