A matrix is "Toepliz" if each descending diagonal from left to right is constant. Given an M x N matrix write the method isToepliz to determine if a matrix is Toepliz.
Example:
67892
46789
14678
01467
判断一个MxN的矩阵是不是“Toepliz”矩阵,就是说其左上右下方向的对角线,每一根上的元素相同,不同对角线之间的不一定相同。
1. 询问
好像没什么好问的。
2. 分析
暴力破解
暴力破解就是找出所有对角线,然后看看是不是都符合条件。例子里面4x5的矩阵,有8条左上-右下方向的对角线,也就是MxN的会有M+N-1条对角线,然后对角线最多有min(M, N)个元素,换个角度来看,矩阵所有的元素都被检查一次,O(MN),空间复杂度是O(1)。
寻找规律
暴力破解的解法,没有尝试寻找规律。从例子里面可以很明显的看到,每一行之间都有关系,假如上一行是a[0]a[N-1],下一行应该是一个新数据开头,然后跟着a[0]a[N-2]。因此,一行一行地比较。这样,每一行复杂度O(N-1),总体O(M(N-1))=O(MN)。不直接比较,求哈希再比,还是一样的复杂度。空间复杂度可以做到O(1)。
正确性浅析
可以认为O(MN)是最优的,因为说到底还是要处理矩阵里面的每一个元素(其实两个角上的不用,但是可以忽略)。假如忽略了其中某一个元素,那个元素就有可能出问题。
这个题暴力破解的复杂度就是最优,虽然说少见但也不是没有,考察重点就在细节实现上了。假如使用第二种利用规律的解法,虽然说复杂度一样,但是明显代码简单不少,更难犯错误。
3. 代码
class Solution:
def isToepliz(self, a):
if not a:
return False
m, n = len(a), len(a[0])
for row in range(1, m):
for col in range(1, n):
if a[row][col] != a[row - 1][col - 1]:
return False
return True
4. 总结
难度Easy。