Easy
题目描述
如果一个正方形矩阵满足下述全部条件,则称之为一个 X 矩阵:
- 矩阵对角线上的所有元素都非零
- 矩阵中所有其他元素都为 0
给你一个大小为 n x n 的二维整数数组 grid,表示一个正方形矩阵。如果 grid 是一个 X 矩阵,返回 true;否则,返回 false。
示例 1:
输入:grid = [[2,0,0,1],[0,3,1,0],[0,5,2,0],[4,0,0,2]]
输出:true
解释:矩阵中的绿色元素(对角线)应该是非零的,红色元素应该是 0。
因此,grid 是一个 X 矩阵。
示例 2:
输入:grid = [[5,7,0],[0,3,1],[0,5,0]]
输出:false
解释:矩阵中的绿色元素(对角线)应该是非零的,红色元素应该是 0。
因此,grid 不是一个 X 矩阵。
提示:
n == grid.length == grid[i].length3 <= n <= 1000 <= grid[i][j] <= 10^5
解题思路
这道题的关键是理解什么是 X 矩阵:主对角线和副对角线上的元素必须非零,其他位置的元素必须为零。
解题思路:
识别对角线位置:对于 n×n 矩阵中的位置 (i,j),如果满足以下条件之一,则该位置在对角线上:
i == j(主对角线)i + j == n - 1(副对角线)
遍历验证:遍历矩阵的每个位置,检查:
- 如果位置在对角线上,元素必须非零
- 如果位置不在对角线上,元素必须为零
优化考虑:也可以分别遍历对角线元素和非对角线元素,但直接遍历整个矩阵更简洁。
时间复杂度:O(n²),需要遍历整个矩阵 空间复杂度:O(1),只使用常量额外空间
这是一道典型的矩阵遍历题,重点在于正确识别对角线位置的判断条件。
代码实现
class Solution {
public:
bool checkXMatrix(vector<vector<int>>& grid) {
int n = grid.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 检查是否在对角线上
bool onDiagonal = (i == j) || (i + j == n - 1);
if (onDiagonal) {
// 对角线上的元素必须非零
if (grid[i][j] == 0) {
return false;
}
} else {
// 非对角线上的元素必须为零
if (grid[i][j] != 0) {
return false;
}
}
}
}
return true;
}
};
class Solution:
def checkXMatrix(self, grid: List[List[int]]) -> bool:
n = len(grid)
for i in range(n):
for j in range(n):
# 检查是否在对角线上
on_diagonal = (i == j) or (i + j == n - 1)
if on_diagonal:
# 对角线上的元素必须非零
if grid[i][j] == 0:
return False
else:
# 非对角线上的元素必须为零
if grid[i][j] != 0:
return False
return True
public class Solution {
public bool CheckXMatrix(int[][] grid) {
int n = grid.Length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 检查是否在对角线上
bool onDiagonal = (i == j) || (i + j == n - 1);
if (onDiagonal) {
// 对角线上的元素必须非零
if (grid[i][j] == 0) {
return false;
}
} else {
// 非对角线上的元素必须为零
if (grid[i][j] != 0) {
return false;
}
}
}
}
return true;
}
}
/**
* @param {number[][]} grid
* @return {boolean}
*/
var checkXMatrix = function(grid) {
const n = grid.length;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i === j || i + j === n - 1) {
if (grid[i][j] === 0) return false;
} else {
if (grid[i][j] !== 0) return false;
}
}
}
return true;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n²) | 需要遍历整个 n×n 矩阵 |
| 空间复杂度 | O(1) | 只使用常量额外空间 |
相关题目
- . Matrix Diagonal Sum (Easy)