Easy

题目描述

如果一个正方形矩阵满足下述全部条件,则称之为一个 X 矩阵

  1. 矩阵对角线上的所有元素都非零
  2. 矩阵中所有其他元素都为 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].length
  • 3 <= n <= 100
  • 0 <= grid[i][j] <= 10^5

解题思路

这道题的关键是理解什么是 X 矩阵:主对角线和副对角线上的元素必须非零,其他位置的元素必须为零。

解题思路:

  1. 识别对角线位置:对于 n×n 矩阵中的位置 (i,j),如果满足以下条件之一,则该位置在对角线上:

    • i == j(主对角线)
    • i + j == n - 1(副对角线)
  2. 遍历验证:遍历矩阵的每个位置,检查:

    • 如果位置在对角线上,元素必须非零
    • 如果位置不在对角线上,元素必须为零
  3. 优化考虑:也可以分别遍历对角线元素和非对角线元素,但直接遍历整个矩阵更简洁。

时间复杂度: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)只使用常量额外空间

相关题目