leetcode 2711. 对角线上不同值的数量差 中等

发布于:2025-03-28 ⋅ 阅读:(21) ⋅ 点赞:(0)

给你一个下标从 0 开始、大小为 m x n 的二维矩阵 grid ,请你求解大小同样为 m x n 的答案矩阵 answer 。

矩阵 answer 中每个单元格 (r, c) 的值可以按下述方式进行计算:

  • 令 topLeft[r][c] 为矩阵 grid 中单元格 (r, c) 左上角对角线上 不同值 的数量。
  • 令 bottomRight[r][c] 为矩阵 grid 中单元格 (r, c) 右下角对角线上 不同值 的数量。

然后 answer[r][c] = |topLeft[r][c] - bottomRight[r][c]| 。

返回矩阵 answer 。

矩阵对角线 是从最顶行或最左列的某个单元格开始,向右下方向走到矩阵末尾的对角线。

如果单元格 (r1, c1) 和单元格 (r, c) 属于同一条对角线且 r1 < r ,则单元格 (r1, c1) 属于单元格 (r, c) 的左上对角线。类似地,可以定义右下对角线。

示例 1:

输入:grid = [[1,2,3],[3,1,5],[3,2,1]]
输出:[[1,1,0],[1,0,1],[0,1,1]]
解释:第 1 个图表示最初的矩阵 grid 。 
第 2 个图表示对单元格 (0,0) 计算,其中蓝色单元格是位于右下对角线的单元格。
第 3 个图表示对单元格 (1,2) 计算,其中红色单元格是位于左上对角线的单元格。
第 4 个图表示对单元格 (1,1) 计算,其中蓝色单元格是位于右下对角线的单元格,红色单元格是位于左上对角线的单元格。
- 单元格 (0,0) 的右下对角线包含 [1,1] ,而左上对角线包含 [] 。对应答案是 |1 - 0| = 1 。
- 单元格 (1,2) 的右下对角线包含 [] ,而左上对角线包含 [2] 。对应答案是 |0 - 1| = 1 。
- 单元格 (1,1) 的右下对角线包含 [1] ,而左上对角线包含 [1] 。对应答案是 |1 - 1| = 0 。
其他单元格的对应答案也可以按照这样的流程进行计算。

示例 2:

输入:grid = [[1]]
输出:[[0]]
解释:- 单元格 (0,0) 的右下对角线包含 [] ,左上对角线包含 [] 。对应答案是 |0 - 0| = 0 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n, grid[i][j] <= 50

分析:由于矩阵最大为50*50,可以直接模拟,对于二维矩阵中每一个单元格,用哈希表分别统计左上角和右下角对角线上不同值的数量。

/**
 * 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** differenceOfDistinctValues(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes) {
    int **ans=(int**)malloc(sizeof(int*)*gridSize);
    int row=*gridColSize;
    *returnSize=gridSize;
    *returnColumnSizes=(int*)malloc(sizeof(int)*gridSize);
    for(int i=0;i<gridSize;++i)
        (*returnColumnSizes)[i]=row,ans[i]=(int*)malloc(sizeof(int)*row);

    for(int i=0;i<gridSize;++i)
    {
        for(int j=0;j<row;++j)
        {
            int cnt1=0,cnt2=0,ll,rr;
            int flag1[55]={0},flag2[55]={0};
            ll=i-1,rr=j-1;
            while(ll>=0&&rr>=0)
            {
                int temp=grid[ll][rr];ll--,rr--;
                if(!flag1[temp])flag1[temp]=1,cnt1++;
            }
            ll=i+1,rr=j+1;
            while(ll<gridSize&&rr<row)
            {
                int temp=grid[ll][rr];ll++,rr++;
                if(!flag2[temp])flag2[temp]=1,cnt2++;
            }
            ans[i][j]=fabs(cnt1-cnt2);
        }
    }

    return ans;
}