給你一個正方形矩陣?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
通過次數(shù)
63.3K
提交次數(shù)
75.9K
通過率
83.3%
一、信息
1.給一個正方型矩陣mat
2.返回矩陣對角線元素的和
二、分析
條件1和條件2:告訴我此次的目的
問題1:該如何求和呢
根據(jù)我的思考步驟
第一步 觀察在矩陣中對角線元素的下標(biāo)特征
通過觀察我發(fā)現(xiàn)主對角線上數(shù)組元素的下標(biāo)都滿足i=j
副對角線都滿足(n-1,0)(0,n-1)即關(guān)于主對角線對稱,我覺得我該回去修一下線性代數(shù)了。
第二步 我們通過for循環(huán)實現(xiàn)累加,if選擇語句結(jié)構(gòu)來篩選。
問題出現(xiàn)1:對了題目并沒有說矩陣是幾×幾的矩陣所以還得測算矩陣的大小
問題出現(xiàn)該如何測算矩陣的大小
已知測算矩陣長度的是length函數(shù)。
答案:
Leetcode答案:
int n = mat.size(), sum = 0;
問題出現(xiàn)2:根據(jù)題目我們不難發(fā)現(xiàn)不僅我們要計算該二維數(shù)組的大小還要開辟動態(tài)的空間,這在C++該怎么辦呢?
很簡答其實用vector即可,如果不記得可以看文章(知識不足的地方)
不知道陷入了停滯
我的答案:
我的答案:
首先我們可以分析這個問題如下:
1. **思考過程**:
? ?- 我們需要計算主對角線和副對角線上的元素和。主對角線上的元素位置是`mat[i][i]`,副對角線上的元素位置是`mat[i][n-1-i]`。
? ?- 如果矩陣的尺寸是奇數(shù),則中心元素會被計算兩次,我們需要減去一次。
? ?
2. **分析過程**:
? ?- 我們可以通過一個循環(huán)從 0 到 n-1 來遍歷所有的行(或列),然后計算對角線元素的和。
? ?- 如果 n 是奇數(shù),我們減去一次`mat[n/2][n/2]`。
現(xiàn)在我們可以將這個邏輯實現(xiàn)為 C、C++ 和 Java 程序:
### C 語言實現(xiàn)
#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: 25
? ? return 0;
}
### C++ 語言實現(xiàn)
#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: 25
? ? return 0;
}
### Java 語言實現(xiàn)
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
? ? }
}
每種語言的實現(xiàn)都遵循了我們的原始分析和設(shè)計,結(jié)合了相應(yīng)語言的特性和語法來實現(xiàn)目標(biāo)功能。
Leetcode題解:
方法一:遍歷矩陣 思路與算法
我們知道矩陣中某個位置 (i,j)(i,j)(i,j) 處于對角線上,則一定滿足下列條件之一:
i=ji = ji=j;
i+j=n?1i + j = n - 1i+j=n?1;
根據(jù)上述結(jié)論,我們可以遍歷整個矩陣,如果當(dāng)前坐標(biāo) (i,j)(i, j)(i,j) 滿足 i=ji = ji=j 或者 i+j=n?1i + j = n - 1i+j=n?1 則表示該位置一定在對角線上,則把當(dāng)前的數(shù)字加入到答案之中。
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;
}
}
?
方法二:枚舉對角線元素 思路與算法
逐行遍歷,記當(dāng)前的行號為 iii,則當(dāng)前行中處于對角線的元素為: 坐標(biāo) (i,i)(i, i)(i,i) 和坐標(biāo) (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) 處的數(shù)字加入到答案中。 如果 nnn 是奇數(shù)的話,則主對角線與副對角線存在交點 (?n2?,?n2?)(\lfloor \dfrac{n}{2} \rfloor,\lfloor \dfrac{n}{2} \rfloor)(??
2
n
?
??,??
2
n
?
??),該點會被計算兩次。所以當(dāng) nnn 為奇數(shù)的時候,需要減掉交點處的值。
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);
}
};
總結(jié):
從這道題目中,我們可以學(xué)到以下幾點:
1. **數(shù)組索引的應(yīng)用**:該題目教會我們?nèi)绾卫脭?shù)組索引來找到主對角線和副對角線的元素。這對于深入理解數(shù)組索引和二維數(shù)組非常有幫助。
2. **循環(huán)的優(yōu)化**:我們可以通過仔細設(shè)計循環(huán)來減少不必要的計算。例如,方法二比方法一更優(yōu),因為它避免了遍歷整個數(shù)組,而是只關(guān)注于對角線元素。
3. **條件運算符的使用**:該題目展示了如何使用條件運算符(如`&`用于檢測奇偶性)來簡化代碼和減少計算。
4. **復(fù)雜度分析**:通過比較兩種方法,我們可以學(xué)習(xí)到如何通過減少循環(huán)次數(shù)和減少重復(fù)計算來降低算法的時間復(fù)雜度。
5. **編程語言的特性**:通過用多種編程語言(C, C++ 和 Java)來解這個問題,我們可以學(xué)習(xí)和比較不同語言中數(shù)組和循環(huán)結(jié)構(gòu)的不同實現(xiàn)和語法。
6. **數(shù)學(xué)應(yīng)用在編程中**:這個問題也是一個很好的例子,展示了數(shù)學(xué)(特別是線性代數(shù))在編程和算法設(shè)計中的應(yīng)用。
7. **代碼測試與調(diào)試**:實現(xiàn)代碼后,我們可以創(chuàng)建多種測試用例來驗證代碼的正確性和效率,從而提高我們的測試和調(diào)試技能。
8. **問題解決技能的培養(yǎng)**:整體來說,解決這種問題可以幫助我們培養(yǎng)分析問題和找到有效解決方案的技能。文章來源:http://www.zghlxwxcb.cn/news/detail-695837.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-695837.html
到了這里,關(guān)于Leetcode 1572.矩陣對角線元素之和的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!