【Leetcode 每日一题】2711. 对角线上不同值的数量差

问题背景

给你一个下标从 0 0 0 开始、大小为 m × n m \times n m×n 的二维矩阵 g r i d grid grid,请你求解大小同样为 m × n m \times n m×n 的答案矩阵 a n s w e r answer answer。

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

  • 令 t o p L e f t [ r ] [ c ] topLeft[r][c] topLeft[r][c] 为矩阵 g r i d grid grid 中单元格 ( r , c ) (r, c) (r,c) 左上角对角线上 不同值 的数量。
  • 令 b o t t o m R i g h t [ r ] [ c ] bottomRight[r][c] bottomRight[r][c] 为矩阵 g r i d grid grid 中单元格 ( r , c ) (r, c) (r,c) 右下角对角线上 不同值 的数量。

然后 a n s w e r [ r ] [ c ] = ∣ t o p L e f t [ r ] [ c ] − b o t t o m R i g h t [ r ] [ c ] ∣ answer[r][c] = |topLeft[r][c] - bottomRight[r][c]| answer[r][c]=∣topLeft[r][c]−bottomRight[r][c]∣。

返回矩阵 a n s w e r answer answer。
矩阵对角线 是从最顶行或最左列的某个单元格开始,向右下方向走到矩阵末尾的对角线。

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

数据约束

  • m = g r i d . l e n g t h m = grid.length m=grid.length
  • n = g r i d [ i ] . l e n g t h n = grid[i].length n=grid[i].length
  • 1 ≤ m , n , g r i d [ i ] [ j ] ≤ 50 1 \le m, n, grid[i][j] \le 50 1≤m,n,grid[i][j]≤50

解题过程

应用类似前后缀分解的思想,按顺序遍历矩阵,分别用集合统计相应的左上和右下的元素数量即可。

进一步追求效率的话,还可以用位运算来模拟集合操作。

具体实现

java 复制代码
class Solution {
    public int[][] differenceOfDistinctValues(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] res = new int[m][n];
        Set<Integer> set = new HashSet<>();
        for (int k = 1; k < m + n; k++) {
            int min = Math.max(n - k, 0);
            int max = Math.min(m + n - 1 - k, n - 1);
            set.clear();
            for (int j = min; j <= max; j++) {
                int i = k + j - n;
                res[i][j] = set.size();
                set.add(grid[i][j]);
            }
            set.clear();
            for (int j = max; j >= min; j--) {
                int i = k + j - n;
                res[i][j] = Math.abs(res[i][j] - set.size());
                set.add(grid[i][j]);
            }
        }
        return res;
    }
}
相关推荐
飞川撸码7 分钟前
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
leetcode·深度优先·宽度优先
半桔19 分钟前
【烧脑算法】不定长滑动窗口:从动态调整到精准匹配以灵活特性实现高效破题
数据结构·c++·算法·leetcode·面试·职场和发展·排序算法
cy晔31 分钟前
B树和B+树
数据结构·b树
不会敲代码的灵长类39 分钟前
机器学习算法-逻辑回归
算法·机器学习·逻辑回归
拓端研究室TRL1 小时前
消费者网络购物意向分析:调优逻辑回归LR与决策树模型在电商用户购买预测中的应用及特征重要性优化
人工智能·算法·决策树·机器学习·逻辑回归
南玖yy1 小时前
C++ 类模板三参数深度解析:从链表迭代器看类型推导与实例化(为什么迭代器类模版使用三参数?实例化又会是怎样?)
开发语言·数据结构·c++·人工智能·windows·科技·链表
进阶的小蜉蝣1 小时前
[leetcode] 二分算法
算法·leetcode·职场和发展
JK0x071 小时前
代码随想录算法训练营 Day61 图论ⅩⅠ Floyd A※ 最短路径算法
算法·图论
Mi Manchi261 小时前
力扣热题100之对称二叉树
python·算法·leetcode
緈福的街口1 小时前
【leetcode】459.重复的子字符串
linux·算法·leetcode