对称矩阵问题解析
问题理解
我们需要判断一个 n×nn \times nn×n 的矩阵(nnn 为偶数)是否同时满足:
1. 左右对称:矩阵关于垂直中线对称
2. 上下对称:矩阵关于水平中线对称
换句话说,矩阵需要同时满足中心对称和轴对称。
数学定义
对于一个矩阵 MMM,如果满足:
* M[i][j]=M[i][n−j−1]M[i][j] = M[i][n-j-1]M[i][j]=M[i][n−j−1](左右对称)
* M[i][j]=M[n−i−1][j]M[i][j] = M[n-i-1][j]M[i][j]=M[n−i−1][j](上下对称)
那么该矩阵就是对称矩阵。
算法思路
1. 检查对称性:只需要检查矩阵的左上四分之一区域
2. 验证对称关系:对于每个元素 M[i][j]M[i][j]M[i][j],检查它是否等于:
* 水平对称点 M[i][n−j−1]M[i][n-j-1]M[i][n−j−1]
* 垂直对称点 M[n−i−1][j]M[n-i-1][j]M[n−i−1][j]
代码实现
算法分析
1. 时间复杂度:O(t×n2)O(t \times n^2)O(t×n2)
* 每组测试用例需要检查 n×nn \times nn×n 个元素
* 但实际只检查了 n2×n\frac{n}{2} \times n2n ×n 个元素,因为利用了对称性
2. 空间复杂度:O(n2)O(n^2)O(n2),用于存储矩阵
优化说明
* 只需要检查矩阵的左上四分之一区域,因为对称性保证了其他区域的对应关系
* 题目保证所有测试用例的 nnn 总和不超过5000,因此算法效率足够
数学验证
对于位置 (i,j)(i, j)(i,j) 的元素:
* 水平对称位置:(i,n−j−1)(i, n-j-1)(i,n−j−1)
* 垂直对称位置:(n−i−1,j)(n-i-1, j)(n−i−1,j)
* 中心对称位置:(n−i−1,n−j−1)(n-i-1, n-j-1)(n−i−1,n−j−1)
由于同时检查了水平和垂直对称,实际上也保证了中心对称。