题目

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

题解

1
2
3
4
5
6
7
8
9
class Solution:
def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:
# 获取每一条对角线上的元素,如果分别都相同,那么就是托普利茨矩阵
# 第二行从第二个开始应该和上一行从头到倒数第二个的数字排列相同
# 用python的数组切片即可
for i in range(1,len(matrix)):
if matrix[i][1:] != matrix[i-1][:-1]:
return False
return True

复杂度分析

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

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

进阶:

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

  • 如果矩阵太大,以至于一次只能将不完整的一行加载到内存中,该怎么办?

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

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