Leetcode 1572.矩阵对角线元素之和
给你一个正方形矩阵 mat
,请你返回矩阵对角线元素的和。
请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]] 输出:25 解释:对角线的和为:1 + 5 + 9 + 3 + 7 = 25 请注意,元素 mat[1][1] = 5 只会被计算一次。
示例 2:
输入:mat = [[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]] 输出:8
示例 3:
输入:mat = [[5]] 输出:5
提示:
n == mat.length == mat[i].length
1 <= n <= 100
1 <= mat[i][j] <= 100
通过次数
63.3K
提交次数
75.9K
通过率
83.3%
一、信息
1.给一个正方型矩阵mat
2.返回矩阵对角线元素的和
二、分析
条件1和条件2:告诉我此次的目的
问题1:该如何求和呢
根据我的思考步骤
第一步 观察在矩阵中对角线元素的下标特征
通过观察我发现主对角线上数组元素的下标都满足i=j
副对角线都满足(n-1,0)(0,n-1)即关于主对角线对称,我觉得我该回去修一下线性代数了。
第二步 我们通过for循环实现累加,if选择语句结构来筛选。
问题出现1:对了题目并没有说矩阵是几×几的矩阵所以还得测算矩阵的大小
问题出现该如何测算矩阵的大小
已知测算矩阵长度的是length函数。
答案:
Leetcode答案:
int n = mat.size(), sum = 0;
问题出现2:根据题目我们不难发现不仅我们要计算该二维数组的大小还要开辟动态的空间,这在C++该怎么办呢?
很简答其实用vector即可,如果不记得可以看文章(知识不足的地方)
不知道陷入了停滞
我的答案:
我的答案:
首先我们可以分析这个问题如下:
1. **思考过程**:
- 我们需要计算主对角线和副对角线上的元素和。主对角线上的元素位置是`mat[i][i]`,副对角线上的元素位置是`mat[i][n-1-i]`。
- 如果矩阵的尺寸是奇数,则中心元素会被计算两次,我们需要减去一次。
2. **分析过程**:
- 我们可以通过一个循环从 0 到 n-1 来遍历所有的行(或列),然后计算对角线元素的和。
- 如果 n 是奇数,我们减去一次`mat[n/2][n/2]`。
现在我们可以将这个逻辑实现为 C、C++ 和 Java 程序:
### C 语言实现
#include <stdio.h>int diagonalSum(int** mat, int matSize, int* matColSize){int sum = 0;for(int i = 0; i < matSize; i++){sum += mat[i][i] + mat[i][matSize - 1 - i];}if(matSize % 2 == 1){sum -= mat[matSize / 2][matSize / 2];}return sum;
}int main() {int mat1[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};int* mat1_ptr[3] = {mat1[0], mat1[1], mat1[2]};printf("%d\n", diagonalSum(mat1_ptr, 3, NULL)); // Output: 25return 0;
}
### C++ 语言实现
#include <vector>
#include <iostream>int diagonalSum(std::vector<std::vector<int>>& mat) {int sum = 0;int n = mat.size();for(int i = 0; i < n; i++) {sum += mat[i][i] + mat[i][n - 1 - i];}if(n % 2 == 1) {sum -= mat[n / 2][n / 2];}return sum;
}int main() {std::vector<std::vector<int>> mat1 = {{1,2,3}, {4,5,6}, {7,8,9}};std::cout << diagonalSum(mat1) << std::endl; // Output: 25return 0;
}
### Java 语言实现
public class Main {public static int diagonalSum(int[][] mat) {int sum = 0;int n = mat.length;for(int i = 0; i < n; i++) {sum += mat[i][i] + mat[i][n - 1 - i];}if(n % 2 == 1) {sum -= mat[n / 2][n / 2];}return sum;}public static void main(String[] args) {int[][] mat1 = {{1,2,3}, {4,5,6}, {7,8,9}};System.out.println(diagonalSum(mat1)); // Output: 25}
}
每种语言的实现都遵循了我们的原始分析和设计,结合了相应语言的特性和语法来实现目标功能。
Leetcode题解:
方法一:遍历矩阵
思路与算法
我们知道矩阵中某个位置 (i,j)(i,j)(i,j) 处于对角线上,则一定满足下列条件之一:
i=ji = ji=j;
i+j=n−1i + j = n - 1i+j=n−1;
根据上述结论,我们可以遍历整个矩阵,如果当前坐标 (i,j)(i, j)(i,j) 满足 i=ji = ji=j 或者 i+j=n−1i + j = n - 1i+j=n−1 则表示该位置一定在对角线上,则把当前的数字加入到答案之中。
class Solution {
public:int diagonalSum(vector<vector<int>>& mat) {int n = mat.size(), sum = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (i == j || i + j == n - 1) {sum += mat[i][j];}}}return sum;}
};
C:
int diagonalSum(int** mat, int matSize, int* matColSize) {int n = matSize, sum = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (i == j || i + j == n - 1) {sum += mat[i][j];}}}return sum;
}
JAVA:
class Solution {public int diagonalSum(int[][] mat) {int n = mat.length, sum = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (i == j || i + j == n - 1) {sum += mat[i][j];}}}return sum;}
}
方法二:枚举对角线元素
思路与算法
逐行遍历,记当前的行号为 iii,则当前行中处于对角线的元素为: 坐标 (i,i)(i, i)(i,i) 和坐标 (i,n−i−1)(i, n - i - 1)(i,n−i−1),因此我们把 (i,i)(i, i)(i,i) 与 (i,n−i−1)(i, n - i - 1)(i,n−i−1) 处的数字加入到答案中。 如果 nnn 是奇数的话,则主对角线与副对角线存在交点 (⌊n2⌋,⌊n2⌋)(\lfloor \dfrac{n}{2} \rfloor,\lfloor \dfrac{n}{2} \rfloor)(⌊
2
n
⌋,⌊
2
n
⌋),该点会被计算两次。所以当 nnn 为奇数的时候,需要减掉交点处的值。
C++:
class Solution {
public:int diagonalSum(vector<vector<int>>& mat) {int n = mat.size(), sum = 0, mid = n / 2;for (int i = 0; i < n; ++i) {sum += mat[i][i] + mat[i][n - 1 - i];}return sum - mat[mid][mid] * (n & 1);}
};
总结:
从这道题目中,我们可以学到以下几点:
1. **数组索引的应用**:该题目教会我们如何利用数组索引来找到主对角线和副对角线的元素。这对于深入理解数组索引和二维数组非常有帮助。
2. **循环的优化**:我们可以通过仔细设计循环来减少不必要的计算。例如,方法二比方法一更优,因为它避免了遍历整个数组,而是只关注于对角线元素。
3. **条件运算符的使用**:该题目展示了如何使用条件运算符(如`&`用于检测奇偶性)来简化代码和减少计算。
4. **复杂度分析**:通过比较两种方法,我们可以学习到如何通过减少循环次数和减少重复计算来降低算法的时间复杂度。
5. **编程语言的特性**:通过用多种编程语言(C, C++ 和 Java)来解这个问题,我们可以学习和比较不同语言中数组和循环结构的不同实现和语法。
6. **数学应用在编程中**:这个问题也是一个很好的例子,展示了数学(特别是线性代数)在编程和算法设计中的应用。
7. **代码测试与调试**:实现代码后,我们可以创建多种测试用例来验证代码的正确性和效率,从而提高我们的测试和调试技能。
8. **问题解决技能的培养**:整体来说,解决这种问题可以帮助我们培养分析问题和找到有效解决方案的技能。
相关文章:

Leetcode 1572.矩阵对角线元素之和
给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出:25 解释:对角线的和为ÿ…...

[PG]将一行数据打散成多行数据
原始数据 比如有如此表结构定义: 假如查询数据如下: select dt as "日期",bj_count as "北京", sh_count as "上海",gz_count as "广州", sz_count as "深圳" from city_stats order by dt--------------------…...

二蛋赠书一期:《快捷学习Spring》
文章目录 前言活动规则参与方式本期赠书《快捷学习Spring》关于本书作者介绍内容简介读者对象 结语 前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,…...

Threejs汽车展厅
2023-09-06-16-29-40 预览:https://9kt8fy-1234.csb.app/ 源码链接...
LeetCode:207. 课程表、210. 课程表 II(拓扑排序 C++)
目录 207. 课程表 题目描述: 实现代码与解析: 拓扑排序 210. 课程表 II 题目描述: 实现代码与解析: 拓扑排序 原理思路: 207. 课程表 题目描述: 你这个学期必须选修 numCourses 门课程࿰…...
如何使用组件
可以复用的代码写到组件里面,比如左侧的导航栏 1.写好一个组件 记得结构写在template标签里面,当然div也可以 2.在需要使用的地方,用标签使用组件 3.在使用的文件内import此组件 import CommonAside from /components/CommonAside.vue; …...
Android 13.0 Launcher3定制之双层改单层(去掉抽屉式二)
1.概述 在13.0的系统产品开发中,对于在Launcher3中的抽屉模式也就是双层模式,在系统原生的Launcher3中就是双层抽屉模式的, 但是在通过抽屉上滑的模式拉出app列表页,但是在一些产品开发中,对于单层模式的Launcher3的产品模式也是常用的功能, 所以需要了解抽屉模式,然后修…...
对卷积的一点具象化理解
前言 卷积的公式一般被表示为下式: 对新手来说完全看不懂这是干什么,这个问题需要结合卷积的应用场景来说。 原理 卷积比较广泛的应用是在信号与系统中,所以有些公式的定义会按照信息流的习惯。假设存在一串信号g(x)经过一个响应h(x)时他的响…...

NV12数据格式转H265编码格式实现过程
一、需求 在视频处理和传输应用中,将视频数据编码为高效的格式是非常重要的。H.265(也称为HEVC)是一种先进的视频编码标准,具有更好的压缩性能和图像质量,相比于传统的编码标准(如H.264)&#…...

ubuntu 22.04 深度学习环境配置
第一步 安装驱动 网址:https://www.nvidia.com/download/index.aspx 根据硬件选择,我这里是 ubuntu 服务器,显卡是v100 sudo su root chmod ax NVIDIA //按 TAB 即可 加运行权限 # 禁用原显卡驱动 vim /etc/modprobe.d/blacklist.conf # 在最后一行…...
支付宝小程序集成mqtt兼容IOS和安卓
1. 前言 去年就想做支付宝小程序接入mqtt协议。但最终多方咨询,问客服问社区得到的答案都是支付宝小程序不能直接支持mqtt协议。偶然间发现徐宏大神的佳作,终于发现了xmqtt.js这个好东西。它实现了支付宝小程序完美接入mqtt协议,设备可以…...

在Qt5中SQLite3的使用
一、SQLite简要介绍 什么是SQLite SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,S…...
使用Docker部署debezium来监控 MySQL 数据库
使用Docker部署debezium来监控 MySQL 数据库 Debezium是一个分布式平台,它将来自现有数据库的信息转换为事件流,使应用程序能够检测并立即响应数据库中的行级更改。 Debezium构建在Apache Kafka之上,并提供了一组Kafka Connect兼容的连接器。每个连接器都与特定的数据库管…...

百度低质量站点怎么办?解决百度低质量站点的方法和工具
百度低质量站点怎么恢复?这是许多网站主和运营人员在SEO优化过程中经常面临的一个问题。百度作为中国最大的搜索引擎,对于网站收录和排名具有至关重要的影响。然而,由于各种原因,有些网站可能面临被百度降权或收录减少的情况。那么…...

MSOS604A是德科技keysight MSOS604A示波器
181/2461/8938Infiniium S系列示波器融合了创新技术,旨在提供卓越的测量。新的10位ADC和低噪声前端技术协同工作,提供高达8 GHz的性能和业界最佳的信号完整性。一个高级框架,配有可快速启动的固态硬盘、可轻松触摸的15英寸电容式显示屏和可快…...

春秋云镜 CVE-2016-0785
春秋云镜 CVE-2016-0785 S2-029 靶标介绍 2.3.28 之前的 Apache Struts 2.x 允许远程攻击者通过标签属性中的“%{}”序列执行任意代码。 启动场景 漏洞利用 工具利用 得到flag flag{a4c7fc9a-8e2d-49b8-9b09-22790fb2bfb6}...
入门ElasticSearch :为什么选择ES作为搜索引擎?
介绍 随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许…...
汽车安全及标准
汽车安全及标准 我们的测试系统如何处理整个标准? 您是否需要处理汽车行业的一系列标准? 不同的标准侧重于驱动逆变器的安全性和功能性: 功能安全(ISO 26262)信号和低压车载网络(LV 124、LV 148 和 VDA …...

APP备案流程详细解读
背景介绍 2023年8月4日,工信部发布《工业和信息化部关于开展移动互联网应用程序备案工作的通知》。 在中华人民共和国境内从事互联网信息服务的APP主办者,应当依照《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》(国务院令第…...

ES 集群常用排查命令
说明:集群使用非默认端口9200,使用的是7116端口举例 一、常用命令 #1.集群健康状态 [wlsadminelastic-01~]$ curl -XGET "http://10.219.27.00:7116/_cluster/health?pretty" { cluster name":"cluster" "status"…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...