Easy
题目描述
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
示例 1:
输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
输出:true
解释:
在上述矩阵中, 其对角线为:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。
各条对角线上的所有元素均相同, 因此答案是 True 。
示例 2:
输入:matrix = [[1,2],[2,2]]
输出:false
解释:
对角线 "[1, 2]" 上的元素不同。
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 200 <= matrix[i][j] <= 99
进阶:
- 如果矩阵存储在磁盘上,并且内存限制使得一次最多只能将矩阵的一行加载到内存中,该怎么办?
- 如果矩阵太大以至于一次只能将不完整的一行加载到内存中,该怎么办?
解题思路
解题思路
核心观察: 托普利茨矩阵的特点是每条从左上到右下的对角线上所有元素都相同。这意味着对于任意位置 (i,j),它应该与其左上角位置 (i-1,j-1) 的元素相同。
方法一:逐一检查(推荐) 最直观的思路是遍历矩阵中每个元素(除了第一行和第一列),检查它是否与左上角的元素相同。如果所有元素都满足条件,则矩阵是托普利茨矩阵。
方法二:按对角线检查 另一种思路是逐条对角线检查。从第一行和第一列的每个位置开始,沿着对角线方向检查所有元素是否相同。这种方法在理解上更直接,但代码相对复杂。
方法三:优化空间(针对进阶问题) 对于内存受限的情况,我们只需要保存上一行的数据,然后与当前行比较即可。这将空间复杂度降低到 O(n)。
由于题目规模较小且第一种方法最简洁高效,我们采用逐一检查的方法作为主要解法。
代码实现
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] != matrix[i-1][j-1]) {
return false;
}
}
}
return true;
}
};
class Solution:
def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:
m, n = len(matrix), len(matrix[0])
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] != matrix[i-1][j-1]:
return False
return True
public class Solution {
public bool IsToeplitzMatrix(int[][] matrix) {
int m = matrix.Length;
int n = matrix[0].Length;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] != matrix[i-1][j-1]) {
return false;
}
}
}
return true;
}
}
var isToeplitzMatrix = function(matrix) {
const m = matrix.length;
const n = matrix[0].length;
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
if (matrix[i][j] !== matrix[i-1][j-1]) {
return false;
}
}
}
return true;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(m×n) | 需要遍历矩阵中除第一行第一列外的所有元素 |
| 空间复杂度 | O(1) | 只使用常数额外空间 |
相关题目
- . Valid Word Square (Easy)