leetcode每日一题:对角线上不同值的数量差

news/2025/3/31 2:01:13/文章来源:https://www.cnblogs.com/podongfeng/p/18791042

image

题目

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

给你一个下标从 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:

img

输入: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

思路

​ 先读懂题目,这里的矩阵对角线仅仅是指,左上方到右下角这个方向的对角线。如果当前位置坐标是(i, j),左上对角线是指 (i-1, j-1)、(i-2, j-2)、 (i-3, j-3)、... 这些位置的连线,右下对焦线只是 (i+1, j+1)、(i+2, j+2)、(i+3, j+3)、... 这些位置的连线。左上对角线和右上对角线都不包含当前节点。

​ 读懂题意后,可以直接模拟,遍历二维数组的每个位置,然后求出这个位置左上角和右下角对角线中不同数值的数量。这里不同值最直观的方法是直接用Set去重。不过注意到值范围[1, 50]很小,我们可以用bitmap的思路,用一个Long类型(64位)的值来存,如果某个值 x 出现,就把从右开始第x位置为1,那么最后不同值的数量就是这个Long值的二进制表示中,1的数量。

图解

image

代码

image

优化

​ 上述直接模拟的方法中,对于同一条对角线,遍历到对角线上每一个位置的时候,都被计算了一遍,存在浪费。我们在遍历二维数组的时候,可以不按照传统的行和列来遍历,而是按照对角线来遍历。对于同一条对角线的位置,我们不难发现 i - j 的值都是相等的,所以我们可以使用 i-j 来记录1条对角线。这条对角线的位置就形成了1个1维数组,我们只需要从前往后、从后往前各遍历1次,就可以得到每个位置左上和右下部分不同值的数量了。

优化后代码

image

public int[][] differenceOfDistinctValues(int[][] grid) {int m = grid.length;int n = grid[0].length;int[][] ans = new int[m][n];// 记录左上方对角线出现的数值long leftTop = 0L;// 记录右下方对角线出现的数值long rightBottom = 0L;// 对于每1条对角线,使用 i - j 来表示,对角线上的每个数字,i - j 的值是相同的for (int k = 1 - n; k <= m - 1; k++) {// 计算左上角出现的数值leftTop = 0;// 对于每个k值,要同时满足 0 <= i < m && 0 <= j < nfor (int i = 0 ; i < m; i++) {int j = i - k;// 排除掉越界的情况if (j < 0 || j >= n) {continue;}ans[i][j] = Long.bitCount(leftTop);leftTop |= 1L << grid[i][j];}// 计算右下角出现的数值rightBottom = 0L;for (int i = m-1 ; i >= 0; i--) {int j = i - k;// 排除掉越界的情况if (j < 0 || j >= n) {continue;}ans[i][j] = Math.abs(ans[i][j] - Long.bitCount(rightBottom));rightBottom |= 1L << grid[i][j];}}return ans;
}

耗时

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本功

知识来源:B站-尚硅谷-武晟然 https://www.bilibili.com/video/BV1WY4y1H7d3/?spm_id_from=333.337.search-card.all.click&vd_source=d9e91669cbb2a200e91188c38bf38a7a 第01章_常用基本命令 ​ Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我…

宝塔部署的Java项目通过域名无法访问问题

背景 1.域名已经绑定IP 2.端口已经开放,宝塔和云服务器的端口设置都开放 3.测试通过公网IP:port可以访问 4.通过域名:port不可以访问 猜测1: Java 项目未绑定到0.0.0.0 Java 项目默认监听 127.0.0.1(仅允许本地访问),无法通过公网 IP 或域名访问。 解决方案:启动 Java 项目…

知识库管理:全流程智能化中枢,驱动企业信息资产高效流转

思通数科智能系统的知识库管理模块,以多模态数据管理为基础,深度融合AI技术与精细化流程控制,构建从内容创建、智能分类到版本追溯的全生命周期管理体系,助力企业实现知识资产的安全存储、高效利用与持续优化。以下是核心功能详解: 一、多模态数据统一存储:打破信息孤岛,…

IPD流程中的风险管理与应对方法

IPD(Integrated Product Development)流程即集成产品开发流程,是一套产品开发的模式、理念与方法。它强调将产品开发视为一个完整的流程,涵盖从市场需求分析、产品规划、设计开发到产品上市及后续维护等各个环节。在当今复杂多变的商业环境中,IPD流程对于企业提升产品竞争…

9.0预览文件失败, 提示需要创建FileUpLoadsTempfilePath并授权

原因: 程序目录下已存在的FileUpLoadTempfilePath对比路径缺少了s, 正确为FileUpLoadsTempfilePath, 如下图.

如何设计一个便携式温度计- NFC/ QT PY/ SHT40

无论你走到哪里,检查周围的温度和湿度,这是一个紧凑的无电池设计! 智能手机虽然功能齐全,功能强大,但由于其设计和主要用途,它并不是理想的温度计。它们的内部温度传感器是用来监测设备性能的,而不是环境条件,它们会受到手机本身和周围环境产生的热量的影响,导致读数不…

hive 异常问题汇总

问题1:创建数据库时报错ERROR : FAILED: Execution Error, return code 40000 from org.apache.hadoop.hive.ql.ddl.DDLTask. MetaException(message:Failed to create external path hdfs://192.168.197.130:9000/user/hive/warehouse/test.db for database test. This may r…

Studio 3T 2025.5 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端

Studio 3T 2025.5 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端Studio 3T 2025.5 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端 The Ultimate GUI, IDE and client for MongoDB 请访问原文链接:https://sysin.org/blog/studio-3t/ 查看最新…

如何衡量PLM项目管理软件的投资回报率(ROI)?

PLM(产品生命周期管理)项目管理软件旨在管理产品从概念到退役的整个生命周期,整合流程、数据和人员,提升企业效率与创新能力。对企业而言,投资PLM项目管理软件是重大决策,衡量其投资回报率(ROI)至关重要,能助企业判断投资是否值得,为后续决策提供依据。 明确PLM项目管…

PLM软件如何降低项目管理中的风险与成本?

项目管理中,风险与成本的有效控制至关重要,关乎项目的成败。PLM(产品生命周期管理)软件作为一种强大的工具,正逐渐在降低项目管理风险与成本方面发挥着不可忽视的作用。它涵盖了从产品概念设计到退役的整个生命周期,整合了各种数据和流程,为项目管理提供了全面而细致的支…

PHP语言开发微信钻石投票系统的可行性

​ 运行环境的要求 PHP >= 7.0.0 MYSQL >=5.6.0 CENTOS >=7.0.0 PHP要安装exif扩展。并且安装PHPMYADMIN 第一步链接数据库 $ourphp = array(version => 3.6.0,webpath => /,webpath_admin => /, // 总后台路径webpath_agent => /, // 代理后台路径valida…

乐维网管平台核心功能解析(三)——告警关联资产

在数字化转型的浪潮中,企业IT基础设施规模持续扩大,传统运维模式面临严峻挑战。当设备告警发生时,运维人员往往需要跨越多个系统查询资产信息,这种割裂的工作流程严重制约故障响应效率。乐维网管平台最新推出的"告警关联资产"功能,通过CMDB深度整合实现了告警与…