Toeplitz Matrix
原题目:
A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element.
Now given an M x N
matrix, return True
if and only if the matrix is Toeplitz.
翻译:
如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是Toeplitz。
现在给出一个M x N
矩阵, True
当且仅当矩阵是Toeplitz时返回。
事例:
Example 1:
Input: matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]] Output: True Explanation: 1234 5123 9512 In the above grid, the diagonals are "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]", and in each diagonal all elements are the same, so the answer is True.
Example 2:
Input: matrix = [[1,2],[2,2]] Output: False Explanation: The diagonal "[1, 2]" has different elements.
Note:
matrix
will be a 2D array of integers.matrix
will have a number of rows and columns in range[1, 20]
.matrix[i][j]
will be integers in range[0, 99]
.
思路:
今天写的这道题,我认为还是比较简单,但是刚开始看到题目的时候还是反应了一会,因为事例中给出的对角线和我想的并不太一样。。。。但是这并不影响做题,下面是我的思路:
1、首先这道题判断的是所有的斜线,而且是从二维数组的后面开始,那么,首先要遍历这个二维数组;
2、然后既然是斜线,那么每个元素则必须和它下一行的前一个元素相同;
3、每次遍历都比较一次是否相同,相同则并一个true,否则并一个false;
4、最后返回遍历完的boolean值。(因为只要一个不一样,结果就是false)
也许看这个思路理解起来有一些困难,下面是我编写的代码:
package com.mianshi.suanfa.ToeplitzMatrix;
/**
* Created by macbook_xu on 2018/4/3.
*/
public class Solution {
public boolean isToeplitzMatrix(int[][] matrix) {
boolean b = true;//用于返回结果
for (int i = matrix.length-1 ; i>=0 ; i--){//从后向前遍历
for (int j = matrix[i].length-1 ; j>=0 ; j--){
if (i-1>=0 && j-1>=0){//边界条件,超过则会数组越界
if (matrix[i][j]==matrix[i-1][j-1]){
b = b & true;
}else {
b = b & false;
}
}
}
}
return b;
}
}
这个代码就是完全按照我说的思路写出来的,看到代码是不是好理解了很多?觉得我的不好理解?那我们可以看看更不好理解的答案:
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[0].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;
}
}
这个答案在我看来真的没有我的想法好理解,它把对角线的差值存在map中,如果已经存在了并且出现了不相等的情况,则直接返回false。
我们问什么特性使得两个坐标(r1, c1)
,并(r2, c2)
属于同一个对角线?
原来两个坐标在同一个对角线上,当且仅当r1 - c1 == r2 - c2
。
这导致了以下想法:记住对角线的值为groups[r-c]
。如果我们看到不匹配,矩阵不是Toeplitz; 否则是。