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.

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:

  1. matrix will be a 2D array of integers.
  2. matrix will have a number of rows and columns in range [1, 20].
  3. matrix[i][j] will be integers in range [0, 99].

这道题让我们验证一个矩阵是否是托普利兹矩阵Toeplitz Matrix,所谓的这个托普利兹矩阵,就是看每条从左上到右下的对角线是否是值都相等。注意矩阵的行数列数不一定相等,要验证所有的对角线。那么其实这道题的本质是让我们斜向遍历矩阵,就是按对角线来。那么博主最先想到的方法就是按照对角线来遍历矩阵,起点是最左下的数字,对于mxn的矩阵,最左下角数字的坐标为(m-1, 0),然后我们开始往右下角遍历,我们先记录每条对角线左上角的数字为val,然后再往右下角遍历的时候,如果同一条对角线上的数字不等于val,直接返回false。当我们遍历完一条对角线的时候,切换一条对角线的时候,是根据起点数字的坐标移动的,如果细心观察会发现,起点位置是先从第一列往上移动,然后在第一行往右移动,那么只要根据起点位置的行坐标是否为0来判断移动的方向即可,比如对于题目中的例子1:

2 3 4
1 2 3
5 1 2

起点移动的方向是9 -> 5 -> 1 -> 2 -> 3 -> 4,参见代码如下:

解法一:

class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[].size(), p = m - , q = ;
while (p >= && q < n) {
int val = matrix[p][q], i = p, j = q;
while (i + < m && j + < n) {
if (matrix[++i][++j] != val) return false;
}
(p > ) ? --p : ++q;
}
return true;
}
};

其实并不需要像上面解法写的那么复杂,我们还可以按正常顺序来遍历数组,对于每个遍历到的数字,都跟其右下方的数字对比,如果不相同,直接返回false即可。为了防止越界,我们不遍历最后一行和最后一列,遍历完成后,返回true,参见代码如下:

解法二:

class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
for (int i = ; i < matrix.size() - ; ++i) {
for (int j = ; j < matrix[i].size() - ; ++j) {
if (matrix[i][j] != matrix[i + ][j + ]) return false;
}
}
return true;
}
};

类似题目:

Valid Word Square

参考资料:

https://leetcode.com/problems/toeplitz-matrix/discuss/113417/Java-solution-4-liner.

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Toeplitz Matrix 托普利兹矩阵的更多相关文章

  1. Leetcode刷题C#版之Toeplitz Matrix

    题目: Toeplitz Matrix A matrix is Toeplitz if every diagonal from top-left to bottom-right has the sam ...

  2. 【LEETCODE】45、766. Toeplitz Matrix

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  3. 766. Toeplitz Matrix - LeetCode

    Question 766. Toeplitz Matrix Solution 题目大意: 矩阵从每条左上到右下对角线上的数都相等就返回true否则返回false 思路: 遍历每一行[i,j]与[i+1 ...

  4. LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题

    Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in sp ...

  5. Toeplitz matrix 与 Circulant matrix

    之所以专门定义两个新的概念,在于它们特殊的形式,带来的特别的形式. 1. Toeplitz matrix 对角为常数: n×n 的矩阵 A 是 Toepliz 矩阵当且仅当,对于 Ai,j 有: Ai ...

  6. 【Leetcode_easy】766. Toeplitz Matrix

    problem 766. Toeplitz Matrix solution1: class Solution { public: bool isToeplitzMatrix(vector<vec ...

  7. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  8. 【LeetCode】766. Toeplitz Matrix 解题报告

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:两两比较 方法二:切片相等 方法三:判断每条 ...

  9. LeetCode - 766. Toeplitz Matrix

    A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element. Now given ...

随机推荐

  1. JQuery代码实现上拉加载(不使用插件)

    <script type="text/javascript"> $(window).scroll(function() { //已经滚动到上面的页面高度 var sl_ ...

  2. 语句in

    Python :in在for中: for name  in names: names='1','2','3','4','5' for name in names: print(names) in no ...

  3. 关于SELECT LAST_INSERT_ID()的使用规则

    尊重个人劳动成果,转载请注明出处: http://blog.csdn.net/czd3355/article/details/71302441 首先我先解释以下在在映射文件中的代码是什么意思. < ...

  4. css3图片模糊过滤特效

    体验效果:点击这里查看效果 代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  5. JavaScript(第七天)【对象和数组】

    什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起.它也常被称做为类,但ECMAScript中却没有这种 ...

  6. JavaScript(第六天)【函数】

    函数是定义一次但却可以调用或执行任意多次的一段JS代码.函数有时会有参数,即函数被调用时指定了值的局部变量.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值. 一.函数声明   函 ...

  7. 数据结构基础——结构体struct及类型别名typedef的使用

    一.结构体的创建 在C语言中,实现数据结构的一种常用方法便是使用结构体(structure)其示例代码如下: struct stu { int num; char ch; }; struct表示创建结 ...

  8. 2017-2018-1 我爱学Java 第四五周 作业

    <打地鼠>Android游戏--需求规格说明书 工作流程 组员分工及工作量比例 <需求规格说明书>的码云链接 总结与反思 参考资料 工作流程 小组成员预先参考蓝墨云班课第八周中 ...

  9. scrapy 爬取当当网产品分类

    #spider部分import scrapy from Autopjt.items import AutopjtItem from scrapy.http import Request class A ...

  10. decltype操作符

    关于decltype操作符的说明: 1.在C++中,decltype作为操作符,用于查询表达式的数据类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些 ...