## 描述
给你一个 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
进阶:
- 如果矩阵存储在磁盘上,并且内存有限,以至于一次最多只能将矩阵的一行加载到内存中,该怎么办?
- 如果矩阵太大,以至于一次只能将不完整的一行加载到内存中,该怎么办?
## 解答
> 矩阵其实可以看做是一个二维数组,那就有行列属性,那本题其实就是考验我们操作二维数据,以及数组的一些特性(随机访问复杂度O(1)等)。
### 五毒神掌
* 读懂本题考查我们什么知识点
> 数组相关操作
* 读懂本题意思
> 判断给定的矩阵是否是拓普利茨矩阵,是返回`true`,否返回`false`
* 列出大概有几种解题思路
> 1.根据图示只要按照行列轮询,判断对角线是否相同,不同则返回`false`;时间复杂度O(mn),空间复杂度O(1)
> 2.同样按照行列轮询,使用`Map` 存储节点值,后面根据对角线的值来与当前存储的值比对,不相等则返回`false`;时间复杂度O(mn),空间复杂度O(m+n)
* 如果切题之后没有思路就看别人写的,然后自己去理解记录
* 后面间隔几天或者几周自己尝试自己写出程序
### Code
* 第一种思路
```Java
class Solution {
public boolean isToeplitzMatrix(int[][] matrix) {
for( int i = 1; i < matrix.length; i++) {
for( int j = 1; j < matrix[i].length; j++) {
if(matrix[i][j] != matrix[i-1][j-1]) {
return false;
}
}
}
return true;
}
}
```
* 第二种思路
```Java
class Solution {
public boolean isToeplitzMatrix(int[][] matrix) {
Map<Integer, Integer> groups = new HashMap();
for (int r = 0; r < matrix.length; r++) {
for (int c = 0; c < matrix[r].length; c++) {
if (!groups.containsKey(r-c)) {
groups.put(r-c, matrix[r][c]);
}
else if (groups.get(r-c) != matrix[r][c]) {
return false;
}
}
}
return true;
}
}
```
### 展示

### 进阶
* 第一题可以将矩阵按照每一行进行拆分,放到连续的数组中即可
* 第二题可以将数据进行分割成不同的小矩阵,但是要保证至少相邻的小矩阵有一行或者一列重复
## 总结
从今天开始每日一题算法,锻炼`Code`能力和思维。潜心修炼,为忘圣继绝学。

諾'766.拓普利茨矩阵(数组)