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"…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...