0766-托普利茨矩阵

Raphael Liu Lv10

给你一个 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.length
  • n == matrix[i].length
  • 1 <= m, n <= 20
  • 0 <= matrix[i][j] <= 99

进阶:

  • 如果矩阵存储在磁盘上,并且内存有限,以至于一次最多只能将矩阵的一行加载到内存中,该怎么办?
  • 如果矩阵太大,以至于一次只能将不完整的一行加载到内存中,该怎么办?

方法一:遍历

根据定义,当且仅当矩阵中每个元素都与其左上角相邻的元素(如果存在)相等时,该矩阵为托普利茨矩阵。因此,我们遍历该矩阵,将每一个元素和它左上角的元素相比对即可。

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int m = matrix.size(), 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;
}
};
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public boolean isToeplitzMatrix(int[][] matrix) {
int m = matrix.length, 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;
}
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
var isToeplitzMatrix = function(matrix) {
const m = matrix.length, 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;
};
[sol1-Golang]
1
2
3
4
5
6
7
8
9
10
11
func isToeplitzMatrix(matrix [][]int) bool {
n, m := len(matrix), len(matrix[0])
for i := 1; i < n; i++ {
for j := 1; j < m; j++ {
if matrix[i][j] != matrix[i-1][j-1] {
return false
}
}
}
return true
}
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
bool isToeplitzMatrix(int** matrix, int matrixSize, int* matrixColSize) {
int m = matrixSize, n = matrixColSize[0];
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;
}

复杂度分析

  • 时间复杂度:O(mn),其中 m 为矩阵的行数,n 为矩阵的列数。矩阵中每个元素至多被访问两次。

  • 空间复杂度:O(1),我们只需要常数的空间保存若干变量。

进阶问题

对于进阶问题一,一次最多只能将矩阵的一行加载到内存中,我们将每一行复制到一个连续数组中,随后在读取下一行时,就与内存中此前保存的数组进行比较。

对于进阶问题二,一次只能将不完整的一行加载到内存中,我们将整个矩阵竖直切分成若干子矩阵,并保证两个相邻的矩阵至少有一列或一行是重合的,然后判断每个子矩阵是否符合要求。

 Comments
On this page
0766-托普利茨矩阵